關於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對象的資料結構:
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;
其中type屬性是記錄對象的類型,可以是REDIS_STRING REDIS_LIST REDIS_HASH REDIS_SET REDIS_ZSET 這五個常量
可以使用命令type來查看一個鍵屬於什麼類型,如下:
127.0.0.1:6379> set name "hell world"
OK
127.0.0.1:6379> get name
"hell world"
127.0.0.1:6379> type name
string
127.0.0.1:6379> sadd sname "zhangsan" "lisi" "wangwu"
(integer) 3
127.0.0.1:6379> smembers sname
1) "wangwu"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> type sname
set
127.0.0.1:6379> lpush lname "zhang" "wang" "zhao" "li"
(integer) 4
127.0.0.1:6379> lrange lname 0 -1
1) "li"
2) "zhao"
3) "wang"
4) "zhang"
127.0.0.1:6379> type lname
list
127.0.0.1:6379>
另外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 100
OK
127.0.0.1:6379> object refcount aa
(integer) 2
127.0.0.1:6379> set bb 100
OK
127.0.0.1:6379> object refcount aa
(integer) 3
127.0.0.1:6379> object refcount bb
(integer) 3
127.0.0.1:6379> set cc 100
OK
127.0.0.1:6379> object refcount aa
(integer) 4
127.0.0.1:6379>
redisObject資料結構中還有兩個屬性沒有介紹,一個是ptr 一個是lru
ptr是一個對象指標,指向的就是該對象的底層實現資料結構,這個資料結構是由encoding屬性決定的。
lru屬性設計到一個對象空轉時間長度的概念 object idletime命令可以得到某個鍵的空轉時間長度,也就是這個命令多長時間沒有被訪問了,lru裡記錄的是最後一個被訪問的時間
127.0.0.1:6379> object idletime aa
(integer) 1775
127.0.0.1:6379> object idletime bb
(integer) 1781
127.0.0.1:6379> object idletime cc
(integer) 1787
127.0.0.1:6379> set cc "zhangsan"
OK
127.0.0.1:6379> set cc "zhangsan"
OK
127.0.0.1:6379> object idletime cc
(integer) 3
127.0.0.1:6379> object idletime cc
(integer) 5
127.0.0.1:6379> object idletime cc
(integer) 6
127.0.0.1:6379> object idletime cc
(integer) 7
127.0.0.1:6379>
小編為你整理Redis的相關內容,可能有你需要的:
Ubuntu 14.04下Redis安裝及簡單測試
Redis叢集明細文檔
Ubuntu 12.10下安裝Redis(圖文詳解)+ Jedis串連Redis
Redis系列-安裝部署維護篇
CentOS 6.3安裝Redis
Redis安裝部署學習筆記
Redis設定檔redis.conf 詳解
Redis 的詳細介紹:請點這裡
Redis 的:請點這裡
本文永久更新連結地址: