Redis對象——Redis對象系統簡介


前言

    之前幾篇文章,簡單介紹 Redis用到的所有主要數據結構,簡單動態字符串(SDS)、雙端鏈表、字典、壓縮列表、整數集合、跳躍表。

    Redis並沒有直接使用這些數據結構來實現鍵值對數據庫,而是基於這些數據結構創建了一個對象系統,這個系統包含字符串對象、列表對象、哈希對象、集合對象和有序集合對象這五種類型的對象,而每種對象又通過不同的編碼映射到不同的底層數據結構。

一、Redis對象類型和編碼

    Redis中的每個對象都由一個redisObject結構表示,該結構中和保存數據有關的三個屬性分別是type屬性、 encoding屬性和ptr屬性:

    Redis使用對象來表示數據庫中的鍵和值,每次當我們在Redis的數據庫中新創建一個鍵值對時,我們至少會創建兩個對象,一個對象用作鍵值對的健(鍵對象),另一個對象用作鍵值對的值(值對象)。

typedef struct redisObiect{
	//類型
	unsigned type:4;
	//編碼
	unsigned encoding:4;
	//指向底層數據結構的指針
	void *ptr;
}

    其中Redis的鍵對象都是字符串對象,而Redis的值對象主要有字符串、哈希、列表、集合、有序集合幾種。其分別對應的內部編碼和底層數據結構如下圖所示:

二、思考一個問題

    Redis中的對象,大都是通過多種數據結構來實現的,為什么會這樣設計呢?用一種固定的數據結構來實現,不是更加簡單嗎?

Redis這樣設計有兩個好處:

  1. 可以自由改進內部編碼,而對外的數據結構和命令沒有影響,這樣一旦開發出更優秀的內部編碼,無需改動外部數據結構和命令,例如Redis3.2提供了quicklist,其結合了ziplist和linkedlist兩者
    的優勢,為列表類型提供了一種更為優秀的內部編碼實現,而對外部用戶來說基本感知不到。 這一點比較像程序設計中的分層架構。
  2. 多種內部編碼實現可以在不同場景下發揮各自的優勢,從而優化對象在不同場景下的使用效率。例如ziplist比較節省內存,但是在列表元素比較多的情況下,性能會有所下降,這時候Redis會根據配置選項將列表類型的內部實現轉換linkedlist。 (后續文章將根據具體對象介紹)

本文重點

  • Redis基於底層的一些數據結構創建了一個對象系統以供用戶使用
  • 這個系統主要包含字符串對象、列表對象、哈希對象、集合對象和有序集合對象
  • Redis的鍵對象都是字符串對象
  • Redis的值對象主要有字符串、哈希、列表、集合、有序集合幾種
  • 為了可以自由改進內部編碼,以及在不同場景下發揮其最大優勢,Redis中的對象,大都是通過多種數據結構來實現

參考

《Redis設計與實現》

《Redis開發與運維》

《Redis官方文檔》

-----END-----


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM