Redis數據類型 隨筆

字符串(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獲取一個哈希中的所有字段和值,不建議對數量巨大的哈希使用此命令。(一個哈希最多能夠容納2^{32}-1字段,如果一個哈希字段非常多,執行HGETALL時很可能會阻塞Redis服務器,這種情況下通常使用HSCAN來增量地獲取所有字段和值)

 

Redis內部使用兩種編碼來存儲哈希對象:

  • ziplist:對於那些長度小於配置中hash-max-ziplist-entries選項配置的值(默認爲512),且所有元素大小都小於配置中hash-max-ziplist-value選項配置的值(默認爲64字節)的哈希,採用此編碼。(ziplist對於較小的哈希而言可以節省佔用空間)
  • hashtable:當ziplist不適用時採用的默認編碼。

 

集合(set)類型

由唯一、無序對象組成的集合(collection)。

它經常用於測試某個成員是否在集合中、重複項刪除和集合運算(求並、交、差集)。

SISMEMBER測試一個元素是否位於集合中,SREM中集合中刪除元素,SCARD獲取集合中成員的數量。

一個集合中最多可以容納2^{23}-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數據類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章