redis對象
redis中有五種常用對象
我們所說的對象的類型大多是值的類型,鍵的類型大多是字符串對象,值得類型大概有以下幾種,但是無論哪種都是基於redisObject實現的
redisObject的結構如下
type的可選值有五種.分別是
encoding的可選值有八種
字符串對象
字符串對象的編碼可以是int,embstr和row
redis中的字符串對象是最常用的數據對象之一,redis中的許多鍵都是採用的字符串對象
字符串類型在redis中根據情況不同有3中情況
對於元素都是純數字類型的, 例如,'1','2'這種會使用int類型存儲,redis默認初始化了10000個數字對象
對於長度小於32的字符串類型,例如'hello',redis會使用embstr類型存儲數據
對於長度超過32的使用row存儲原字符
ps: embstr類型的字符串在修改後總會變成row編碼類型
列表
列表的編碼可以是linkedlist或者ziplist
當列表對象保存的所有字符串長度小於64字節
當列表對象保存的元素數量小於512個的時候
這個時候會使用,ziplist來作為列表對象的編碼, 當不滿足這兩個條件的時候使用linkedlist
ps:這兩個值是更改的,list-max-ziplist-value 和 list-max-ziplist-entries
哈希對象
哈希對象的編碼可以是ziplist或者hashtable
字典的每一個鍵和值都是一個字符串對象
哈希對象保存的所有鍵和值的長度都小於64字節
哈希對象保存的鍵值對數量小於512個的時候
滿足以上兩個條件,使用ziplist存儲,否則採用hashtable存儲
ps:這兩個值是更改的,hash-max-ziplist-value 和 hash-max-ziplist-entries
集合
集合對象的編碼可以是intset或者hashtable
當集合對象滿足以下兩個條件的時候採用intset
集合對象保存的元素都是整數
集合對象保存的元素數量不超過512個
不滿足以上兩個條件都是用hashtable存儲
ps: 該數值可以使用set-max-intset-entries設置
有序集合
有序集合對象的編碼可以是ziplist或者skiplist
有序集合對象跟前面的幾個對象不大一樣
zsl中保存一個跳躍表,表節點的對象即使鍵,score即是分值,該結構主要為 zrange,zrank等函數服務
同時還保存一個dict,dict中也保存有鍵和對應的分值,獲取某鍵的函數zscore使用這個結構,
同時持有字典和跳躍表是為了性能考慮
當有序集合滿足一下兩個條件時候,使用ziplist編碼
有序集合元素數量小於128
有序集合元素長度小於64
不能滿足以上兩個條件的使用skiplist
回收
redis的對象資源垃圾回收是基於引用計數
當一個對象被使用一次,引用計數增加1
當一個引用被銷燬,對象的引用計數會減1
當一個對象的引用計數為0,會被銷燬
對象共享
redis默認創建了0到9999的數字對象供1萬個
其他用到這些對象的時候可以不用創建新對象,直接使用已有的對象
500萬陽光基金助力就業季:
http://www.ujiuye.com/zt/jyfc/?wt.bd=fq37300j
更多幹貨請關注優就業官網:
http://www.ujiuye.com/?wt.bd=fq37300j