字符串是 Redis 最基本的數據類型。一個字符串最大爲 512M 字節。字符串數據類型適用於不少場景,例如,緩存 HTML 片斷或者頁面。redis
Redis 字符串是二進制安全的,也就是說,一個 Redis 字符串能夠包含任意類型的數據,例如一張 JPEG 圖像,或者一個序列化的對象。數據庫
咱們能夠把字符串當作位數組(位圖)來處理,很容易統計一些基於0/1邏輯的業務;數組
使用 INCR 命令族 (INCR,DECR,INCRBY),將字符串做爲原子計數器;緩存
使用 APPEND 命令追加字符串等等。安全
set name tom,永久有效。app
set name tom ex 60,60秒後過時。測試
set name tom px 6000,6000毫秒(6秒)後過時。日誌
ex、px 不能同時寫,不然之後面一個時間爲準。對象
如set name tom ex 60 px 6000,實際上6秒後就過時了。blog
nx表示key不存在時執行操做,xx表示key存在時執行操做。
只要有一個存在就都不會被設置。
返回新字符串的長度。
偏移量的下標以0開始,value有多少個長度,則替換多少個長度的字符。
若是offset超出字符串的長度,則以空白的部分以0x00填充。
字符串下標左數從0開始,右數從-1開始。
獲取左邊第二個(1)到右邊第一個(-2)的值。
start >= length,返回空字符串。end >= length,截取至字符結尾。
incr/decr 命令將字符串值解析爲整數,可做爲原子計數器。incr 命令是原子的,由於即便多個客戶端對同一個鍵發送 incr 命令也不會形成競爭條件,讀 - 加/減 - 寫操做在執行時,其餘客戶端此時不會執行相關命令。
incr/decr一般可用於計數、搶單的場合,例若有2000張火車票,同時有10萬人搶2000張火車票,可能一分鐘內就搶完了。若是同時去數據庫查詢剩餘票數或下訂單,數據庫壓力很大。
此時可在redis中設置一個票數的緩存,搶票的人先搶到下訂單的資格,後臺再慢慢去下訂單更新數據庫。得到資格後,自動減一,並返回了剩餘票數。剩餘票數爲0,就可過濾掉絕大部分請求了。
若是key不存在,則默認key爲0,再執行加減的操做。
num爲整數。
若是要減小,float爲負數便可。
例如,我要將大寫的字母變爲小寫的字母,大寫字母和小寫字母相差32,差別就是大寫字母二進制位偏移量2的位置爲0,小寫字母爲1,。
經典的應用就是使用位圖法統計活躍用戶,例如統計連續一週登陸用戶。
若是有1億用戶,登陸日誌存儲在數據庫表中,表急劇增大,直接在數據庫中統計,計算較慢。
那麼使用位圖法就能輕鬆解決這個問題,天天按日期生成一個位圖(位數組),用戶是否登陸就用1/0標識,用戶登陸後,把user_id位上的值置爲1,標識該用戶已登陸。把一週的位圖作and運算,位上爲1的就是連續登陸的用戶。
一個位圖算1億個位,100000000/8/1024/1024 ≈ 12M,也就是說天天只須要12M就能存儲1億用戶是否登陸的狀況,節約空間,計算方便。
ID爲100000000的用戶,設置周1、周2、週三連續登陸,最後作AND操做,得出該用戶連續登陸:
ID爲5000的用戶,週一登陸,週二不登陸,週三登陸(能夠不設置,默認填充0),作AND操做,得出未連續登陸:
operation 能夠是AND、OR、NOT、XOR
Redis列表是簡單的字符串列表,排序爲插入的順序。列表的最大長度爲2^32 - 1 。
Redis 的列表是使用鏈表實現的。這意味着,即便你的列表中有上百萬個元素,增長一個元素到列表的頭部或者尾部的操做都是在常量時間完成。Redis 採用鏈表來實現列表是由於,對於數據庫系統來講,快速插入一個元素到一個很長的列表很是重要。
咱們能夠用列表獲取最新的內容(像帖子、微博等),用ltrim很容易就獲取最新的內容,並移除舊的內容。
用列表能夠實現生產者消費者模式,生產者調用 lpush 添加項到列表中,消費者調用 rpop 從列表提取,若是沒有元素,則輪詢去獲取,或者使用brpop等待生產者添加項到列表中。
插入成功,返回列表的個數。能夠同時插入多個值。
lpushx key value:當key存在是才插入數據
左數從0開始,右數從-1開始。因此想取出所有元素能夠用lrange key 0 -1。
rpushx key value:當key存在是才插入數據。
刪除count絕對值個value,count>0,從頭部開始刪除;count<0,從尾部開始刪除。
有些時候咱們只想用列表存儲最近的項,咱們可使用ltrim命令僅僅只記住最近的10項,而丟棄全部老的項。能夠很容易實現新增一個元素而拋棄超出的元素。
只會在第一個匹配的search以後|以前插入,不會插入多個value。
若是有元素則直接彈出,沒有則阻塞,timeout爲等待超時時間,若是timeout爲0,則一直等待。
通常可用於輪詢,在線聊天,例若有一個message列表,在獲取消息的時候,沒有就等待,有就彈出。
使用一個終端來等待消息:
另外一個終端插入消息:
消息被彈出:
等待超時:
使用rpoplpush相比分開rpop,lpush兩步操做是原子性的,使用 rpoplpush 能夠構建更安全的隊列和旋轉隊列。
rpoplpush通常可用於構建安全任務隊列,好比有一個任務隊列task,每次從中取出一個任務來執行,放到另外一個列表bak來備份。這樣任務若是執行成功,從bak列表中移除該任務;失敗,能夠再拿回task列表。
結合了brpop喝rpoplpush的特性,有則彈出放到另外一個列表,沒有則等待。
Redis 集合是無序的字符串集合,集合中的值是惟一的、無序的。能夠對集合執行不少操做,例如,測試元素是否存在,對多個集合執行交集、並集和差集,等等。
咱們一般能夠用集合存儲一些無關順序的,表達對象間關係的數據,例如用戶的角色,能夠用sismember很容易就判斷用戶是否擁有某個角色。
在一些用到隨機值的場合是很是適合的,能夠用 srandmember/spop 獲取/彈出一個隨機元素。
在string和list的命令中,能夠經過range來獲取某幾個字符或某幾個元素,但集合是無序的,沒法經過下標或範圍來訪問部分元素,所以要麼隨機選一個,要麼全選。
存在則返回1,不存在則返回0
sinterstore dest k1 k2 ... kn:求集合的交集,並將結果賦給dest
同理,sunionstore則將並集的結果賦給dest。
能夠用sunionstore複製一個集合
即k1-k2-kn
有序集合由惟一的,不重複的字符串元素組成。有序集合中的每一個元素都關聯了一個浮點值,稱爲分數。能夠把有序當作hash和集合的混合體,分數即爲hash的key。
有序集合中的元素是按序存儲的,不是請求時才排序的。
score爲分數,他們按照以下規則排序:
向有序集合中添加元素,會自動排序且爲升序
有序集合的分數能夠重複,但值不能重複,元素是惟一的。
withscores,是否顯示排序分數。zrange默認返回升序序列。
與zrange獲取的順序相反。
返回的排名升序從下標0開始
返回的排名降序從下標0開始
+inf表示正無窮,-inf表示負無窮。
相似於分頁查詢,若是N超出個數,返回直到結尾。
與zrangebyscore順序相反,注意範圍是[max, min]
從這裏也能夠看出有序集合中的元素是惟一性的。
求key一、key2的交集,key一、key2的權重分別是weight一、weight2;numkeys指定key的個數。
聚合方法爲sum|min|max,結果保存到dest中,默認交集求和。能夠看作先作交集再作後面的運算。
一樣,取並集用zunionstore,其他參數同樣。
添加兩組數據:
交集求和:
交集最大值:
交集加上權重取最大值:加上權重時:score = score * weight
Redis的哈希值是字符串字段和字符串值之間的映射,是表示對象的完美數據類型。
哈希中的字段數量沒有限制,因此你能夠在你的應用程序以不一樣的方式來使用哈希。
沒有field則寫入,有則覆蓋
使用hsetnx就不會覆蓋原值
只能增長整數,不能增長小數。也能夠增長負數。