1. 程式人生 > 資料庫 >redis進階(二)

redis進階(二)

  如上一篇文章所述,介紹了redis底層的幾種資料型別(簡單動態字串SDS、雙端連表、字典、壓縮列表、整數集合等),但是在redis並沒有直接使用這些資料型別實現鍵值對資料庫,redis是在基礎資料型別的基礎上又封裝了一層,實現了一個包含了五種資料結構型別的統一物件。

  每次在redis中建立一個鍵值對,都是建立了兩個redis物件,其中一個用作redis鍵,一個用作值。(整理自redis設計與實現(第二版)第八章)

  下面介紹一下redis的資料儲存物件。物件的結構如下圖所示:

 

 從此可以引出一下幾個問題:

1、為什麼要使用redisObject,優點是什麼

    • 通過不同型別的物件,Redis 可以在執行命令之前,根據物件的型別來判斷一個物件是否可以執行給定的命令。
    • 我們可以針對不同的使用場景,為物件設定不同的資料結構實現,從而優化物件在不同場景下的使用效率。

2、object中的各個引數有什麼作用

  (1)type(型別)

type記錄了物件的型別。可以是字串物件、列表物件、雜湊物件、集合物件、有序集合物件中的一種。對於redis資料庫儲存的鍵值對來說,鍵永遠是字串物件,值可以是所有型別其中的一種。

  

  使用type命令可以檢視鍵值對中值物件的型別,其中返回的值物件型別如下圖所示:

   

  (2)encoding(編碼)

    encoding屬性記錄了物件所使用的的編碼,即這個物件使用什麼資料結構作為物件的底層實現。屬性值如下表所示:

  

    每種資料物件都至少使用了兩種不同的編碼。下表列出了每種物件可以使用的編碼。

  

 

      使用object encoding命令,可以檢視資料庫值物件使用的編碼,下表為對應的輸出 

           

  (3)lru:REDIS_LRU_BITS(物件最後一次被訪問的時間)

    可以用於計算資料建的空轉時長,在伺服器啟動了maxmemory的情況下,空轉時長較大的鍵可能會優先被伺服器刪除

  (4)refcount(引用計數)

    引用計數的優點:redis的垃圾回收是基於引用計數實現的,當物件不再被引用時,則釋放物件佔用的記憶體;

    redis通過引用計數實現了物件共享複製,在適當情況下,可以使用多個數據庫鍵值共享同一物件

  (5)*ptr(指向實際值的指標)

    指標ptr指向物件底層的資料結構實現,而這些資料結構有物件的encoding屬性決定

 

  總結如下:

    (1)redis資料庫中的每個鍵值對的鍵和值都是一個物件

    (2)redis共有字串、列表、雜湊、集合、有序集合五種型別的物件,每種型別的物件至少都有兩種或以上的編碼方式,不同的編碼可以再不同的使用場景上優化物件的使用效率

    (3)伺服器再執行某些命令之前,會先檢查給定鍵的型別能否執行執行的命令,而檢查檢查一個鍵的型別就是檢查一個鍵的值物件的型別

    (4)redis的物件系統帶有引用計數實現的記憶體回收機制,當一個物件不再被使用時,該物件所佔用的記憶體就會被釋放。

    (5)redis會共享值從0-9999的字串物件

    (6)物件會記錄自己的最後一次被訪問時間,這個時間可以用於計算物件的空轉 

下一篇文章將介紹不同資料型別的編碼實現