關於Redis五種類型對象的學習筆記

來源:互聯網
上載者:User

關於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 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.