redis設計與實現讀書筆記-對象

Redis用到的所有主要數據結構,比如簡單動態字符串(SDS)、雙端鏈表、字典、壓縮列表、整數集合等等,Redis並沒有直接使用這些數據結構來實現鍵值對數據庫,而是基於這些數據結構創建了一個對象系統,這個系統包含字符串對象、列表對象、哈希對象、集合對象和有序集合對象這五種類型的對象,每種對象都用到了至少一種我們前面所介紹的數據結構。

Redis的對象系統還實現了基於引用計數技術的內存回收機制,當程序不再使用某個對象的時候,這個對象所佔用的內存就會被自動釋放;另外,Redis還通過引用計數技術實現了對象共享機制,這一機制可以在適當的條件下,通過讓多個數據庫鍵共享同一個對象來節約內存。

Redis的對象帶有訪問時間記錄信息,該信息可以用於計算數據庫鍵的空轉時長,在服務器啓用了maxmemory功能的情況下,空轉時長較大的那些鍵可能會優先被服務器刪除。

 對象的類型與編碼

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

對於Redis數據庫保存的鍵值對來說,鍵總是一個字符串對象,而值則可以是字符串對象、列表對象、哈希對象、集合對象或者有序集合對象的其中一種

 

編碼和底層實現

對象的ptr指針指向對象的底層實現數據結構,而這些數據結構由對象的encoding屬性決定。encoding屬性記錄了對象所使用的編碼,也即是說這個對象使用了什麼數據結構作爲對象的底層實現

 

對象共享

在Redis中,讓多個鍵共享同一個值對象需要執行以下兩個步驟:

1)將數據庫鍵的值指針指向一個現有的值對象;

2)將被共享的值對象的引用計數增一。

目前來說,Redis會在初始化服務器時,創建一萬個字符串對象,這些對象包含了從0到9999的所有整數值,當服務器需要用到值爲0到9999的字符串對象時,服務器就會使用這些共享對象,而不是新創建對象。

總結

❑Redis數據庫中的每個鍵值對的鍵和值都是一個對象。

❑Redis共有字符串、列表、哈希、集合、有序集合五種類型的對象,每種類型的對象至少都有兩種或以上的編碼方式,不同的編碼可以在不同的使用場景上優化對象的使用效率。

❑服務器在執行某些命令之前,會先檢查給定鍵的類型能否執行指定的命令,而檢查一個鍵的類型就是檢查鍵的值對象的類型。❑Redis的對象系統帶有引用計數實現的內存回收機制,當一個對象不再被使用時,該對象所佔用的內存就會被自動釋放。

❑Redis會共享值爲0到9999的字符串對象。❑對象會記錄自己的最後一次被訪問的時間,這個時間可以用於計算對象的空轉時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章