一、前言
Redis除了可以存儲鍵還可以存儲常見的5種資料類型,分别是:String、List、Set、Hash、ZSet。對于Redis的指令有一部分是可以公用的,但是還有一些其他的指令是屬于特殊使用的。
首先看看一張關于Redis5種資料結構的對比:
下邊就分别介紹5中國不同的資料結構類型。
二、String字元串類型
Redis中的String類型就是一個由位元組組成的序列,他和其他程式設計語言或者其他鍵值對存儲提供的字元串操作非常相似。
一個String類型的執行個體,其中鍵為hello,值為world:
(1)常用指令如下:
(2)Redis中的自增指令和自減指令:
(3)除了get、set、del、自增、自減等操作外,Redis還提供了下面一些操作:
- 擷取字元串長度
- 往字元串append内容
- 設定和擷取字元串的某一段内容
- 設定及擷取字元串的某一位(bit)
- 批量設定一系列字元串的内容
如下圖所示:
(4)應用場景:
String是最常用的一種資料類型,普通的key/value存儲都可以歸為此類,value其實不僅是String, 也可以是數字:比如想知道什麼時候封鎖一個IP位址(通路超過幾次)。INCRBY指令讓這些變得很容易,通過原子遞增保持計數。
三、List清單類型
Redis中的List其實就是連結清單(redis 使用雙端連結清單實作的 List),相信學過資料結構知識的人都應該能了解其結構。
使用 List 結構,我們可以輕松地實作最新消息排行等功能(比如新浪微網誌的 TimeLine )。List 的另一個應用就是消息隊列,可以利用 List 的 PUSH 操作,将任務存在 List 中,然後工作線程再用 POP 操作将任務取出進行執行。
一個List類型的執行個體,清單包含的元素,相同元素可以重複出現:
需要注意的是:一個List結構可以有序的存儲多個字元串,并且是允許元素重複的。
LPUSH和RPUSH指令分别用于将元素推入清單的左端和右端;LPOP和RPOP指令分别用于從清單的左端和右端彈出元素,也就是删除元素;
其中對于LRANGE指令來說,使用0位範圍的起始索引,-1為範圍的結束索引,可以取出清單包含元素的所有元素。
(2)除了上邊比較常用的指令之外,Redis清單還可以從清單裡邊移除元素、将元素插入清單中間、将清單修剪至指定長度的指令,以及一些其他指令。
(3)使用場景:
- 微網誌 TimeLine
- 消息隊列
四、Set集合類型
Redis的集合和清單都可以存儲多個字元串,他們的不同支援在于,清單可以存儲多個相同的字元串,而集合通過使用散清單來保證自己存儲的每個字元串都是各不相同的。
Redis的集合使用的是無序的方式存儲元素,是以不可以像List清單那樣,将元素推入集合的某一端,或者從集合的某一端彈出元素。
一個Set集合類型的執行個體,各不相同的元素,無序排列:
(2)除了常見的指令之外,還有交集、并集、差集的計算,如下:
- 共同好友、二度好友
- 利用唯一性,可以統計通路網站的所有獨立 IP
- 好友推薦的時候,根據 tag 求交集,大于某個 threshold 就可以推薦
五、Hash散列類型
Redis的散列可以存儲多個鍵值對之間的映射。和字元串一樣,散列存儲的值既可以是字元串又可以是數字值,并且使用者同樣可以對散列存儲的數字執行自增操作或者是自減操作。
一個List散列類型的執行個體,是一個包含兩個鍵值對的散列鍵:
(2)其他指令包含添加和删除鍵值對的指令、擷取所有鍵值對的指令、以及對鍵值對的值進行自增和自減操作的指令,如下所示:
六、Redis的有序集合ZSet資料類型
有序集合和散列一樣,用于存儲鍵值對;有序集合的鍵被稱為成員member,每一個成員都是獨一無二的;而有序集合的值被稱為分值score,分值必須是浮點數。
有序集合是Redis裡面唯一一個既可以根據成員通路元素,又可以根據分值以及分值的排序來通路元素的結構。
一個有序集合類型的執行個體,zset-key是一個包含兩個元素的有序集合鍵: