字符串(string)類型
Redis使用了三種不同的編碼方式來存儲字符串對象,並會根據每個字符串值自動決定所使用的編碼方式:
- int:用於能夠使用64位有符號整數表示的字符串;
- embstr:用於長度小於等於44字節(在Redis3.x版本中是39字節)的字符串;
- raw:用於長度大於44字節的字符串。
可以採用OBJECT ENCODING來查看編碼。
列表(list)類型
Redis中的列表與雙向鏈表類似
LPUSH左端插入,RPUSH右端插入,LINSERT某鍵之前或之後插入。
向一個不存在的鍵中插入元素,Redis會先創建一個空列表並將其與鍵關聯;
也不需要刪除值爲空列表的鍵,Redis會自動回收這種鍵。
LINDEX獲取指定索引處的元素,LRANGE獲取一個範圍內的元素。
列表的索引從左到右指定爲0~N-1;從右到左指定爲-1~-N。
因此,獲取整個列表就是0~~1(例:LRANGE key 0 -1 就是獲取鍵爲key的整個列表)。
LSET設置列表中指定索引位置處元素的值。
LPOP從列表左端移除第一個元素,RPOP從列表右端移除第一個元素。對不存在的鍵使用此命令時,返回nil
對應的阻塞版本爲:BLPOP和BRPOP。當列表爲空時,會將客戶端阻塞。
可以設置一個以秒爲單位的超時時間,超時時間爲0時,表示永久等待。(此特性在任務調度中非常有用)
Redis在內部使用quicklist存儲列表對象,下列配置選項可以調整列表對象的存儲邏輯:
- list-max-ziplist-size:一個列表條目中一個內部節點的最大大小。
- list-compress-depth:列表壓縮策略(列表兩端不被壓縮的節點個數,當列表很長且最可能被訪問的元素在兩端,用此參數精確地進行調優可以實現在壓縮比和其它因素之間的平衡)。
哈希(hash)類型
哈希表示字段和值之間的映射關係,與某些語言中字典類型類似。
與列表(list)類型類似,添加字段前無需先初始化一個空的哈希,變爲空時Redis會自動將其刪除。
HDEL從哈希中刪除字段。
HGETALL獲取一個哈希中的所有字段和值,不建議對數量巨大的哈希使用此命令。(一個哈希最多能夠容納-1字段,如果一個哈希字段非常多,執行HGETALL時很可能會阻塞Redis服務器,這種情況下通常使用HSCAN來增量地獲取所有字段和值)
Redis內部使用兩種編碼來存儲哈希對象:
- ziplist:對於那些長度小於配置中hash-max-ziplist-entries選項配置的值(默認爲512),且所有元素大小都小於配置中hash-max-ziplist-value選項配置的值(默認爲64字節)的哈希,採用此編碼。(ziplist對於較小的哈希而言可以節省佔用空間)
- hashtable:當ziplist不適用時採用的默認編碼。
集合(set)類型
由唯一、無序對象組成的集合(collection)。
它經常用於測試某個成員是否在集合中、重複項刪除和集合運算(求並、交、差集)。
SISMEMBER測試一個元素是否位於集合中,SREM中集合中刪除元素,SCARD獲取集合中成員的數量。
一個集合中最多可以容納-1個成員。
SMEMBERS獲取集合中所有元素,成員很多情況下使用可能會阻塞服務器,此時應該使用SSCAN。
Redis內部兩種編碼方式來存儲集合對象:
- intset:對於那些元素都是整數且元素個數小於配置中set-max-intset-entries選項設置的值(默認12)的集合,對於較小的集合可以節省佔用空間。
- hashtable:intset不適用時的默認編碼。
有序集合(sorted set)類型
集合中每個元素都有一個可以用於排序的權重,並且可以按照順序從集合中獲取元素。
唯一計數(HyperLogLog)類型
採用集合來進行唯一計數時,當數據量達到上千萬就需要考慮內存消耗和性能下降的問題了。
如果不需要獲取數據集的內容,而只是想得到不同值的個數,這時候就使用HyperLogLog類型最好了。
PFCOUNT獲取數量
優勢在於能夠使用固定數量的內存(每個鍵只需佔用12KB就可以計算最多2^64個不同元素的基數)和時間複雜度(每個鍵O(1))進行唯一計數。不過由於HLL算法返回的基數可能不準確(標準差小於1%),因此在決定是否使用HLL時需要進行權衡。
地理位置(Geo)類型
GEORADIUS獲取指定座標指定距離內的地點成員;
GEODIST獲取兩點之間的距離;
GEORADIUSBYMEMBER獲取指定成員指定距離內的其他成員
Geo集合實際上被存儲爲一個有序集合,因此有序集合支持的命令都可以用於Geo數據類型。