關於Redis五種類型對象的學習筆記,redis五種學習筆記
我們在使用Redis的時候,直接接觸到的是字串對象(String),列表對象(List),雜湊對象(Hash),集合對象(Set),有序集合對象(SortedSet)這五種類型的對象,基本的命令如:String(get set) List(lpush rpush lpop rpop lrange) Hash(hget hset hlen hgetall) Set(sadd smembers smov) SortedSet(Zadd Zrange)等。
我們首先看一下redis對象的資料結構:
<span style="font-size:14px;">typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; void *ptr;} robj;</span>
其中type屬性是記錄對象的類型,可以是REDIS_STRING REDIS_LIST REDIS_HASH REDIS_SET REDIS_ZSET 這五個常量
可以使用命令type來查看一個鍵屬於什麼類型,如下:
<span style="font-size:14px;">127.0.0.1:6379> set name "hell world"OK127.0.0.1:6379> get name"hell world"127.0.0.1:6379> type namestring127.0.0.1:6379> sadd sname "zhangsan" "lisi" "wangwu"(integer) 3127.0.0.1:6379> smembers sname1) "wangwu"2) "zhangsan"3) "lisi"127.0.0.1:6379> type snameset127.0.0.1:6379> lpush lname "zhang" "wang" "zhao" "li"(integer) 4127.0.0.1:6379> lrange lname 0 -11) "li"2) "zhao"3) "wang"4) "zhang"127.0.0.1:6379> type lnamelist127.0.0.1:6379></span>
另外encoding屬性記錄了對象使用什麼編碼,這個需要說明一點,redis可以針對不同的使用情境,為對象設定多種不同的資料結構實現,比如,都是hash類型對象,針對不同的資料,可以使用不同的底層實現,如果是hash中的鍵比較少,並且儲存的元素也都是比較短的字串的時候,使用的底層實現是壓縮列表,反之,使用字典作為底層實現,可以使用object encoding命令查看使用的什麼底層實現。
127.0.0.1:6379> object encoding name"embstr"127.0.0.1:6379> object encoding sname"hashtable"127.0.0.1:6379> object encoding lname"ziplist"127.0.0.1:6379>
這樣做的好處是什嗎?可以提高靈活性和效率,根據不同的使用情境來為對象設定不同的編碼,最佳化對象在某一情境下的效率。
接下來的refcount屬性是做什麼用的呢?設計到兩個內容,一是記憶體回收,一個是對象共用
這個計數器就是當一個對象被建立出來之後,refcount+1,當對象被一個新程式引用,那麼計數器+1,反之-1,但這個計數器為0的時候,表示資源可以被釋放了
至於對象共用,【redis值對包含整數型的字串對象進行共用】
127.0.0.1:6379> set aa 100OK127.0.0.1:6379> object refcount aa(integer) 2127.0.0.1:6379> set bb 100OK127.0.0.1:6379> object refcount aa(integer) 3127.0.0.1:6379> object refcount bb(integer) 3127.0.0.1:6379> set cc 100OK127.0.0.1:6379> object refcount aa(integer) 4127.0.0.1:6379>
redisObject資料結構中還有兩個屬性沒有介紹,一個是ptr 一個是lru
ptr是一個對象指標,指向的就是該對象的底層實現資料結構,這個資料結構是由encoding屬性決定的。
lru屬性設計到一個對象空轉時間長度的概念 object idletime命令可以得到某個鍵的空轉時間長度,也就是這個命令多長時間沒有被訪問了,lru裡記錄的是最後一個被訪問的時間
127.0.0.1:6379> object idletime aa(integer) 1775127.0.0.1:6379> object idletime bb(integer) 1781127.0.0.1:6379> object idletime cc(integer) 1787127.0.0.1:6379> set cc "zhangsan"OK127.0.0.1:6379> set cc "zhangsan"OK127.0.0.1:6379> object idletime cc(integer) 3127.0.0.1:6379> object idletime cc(integer) 5127.0.0.1:6379> object idletime cc(integer) 6127.0.0.1:6379> object idletime cc(integer) 7127.0.0.1:6379>
======================================================================================================
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。