對象類型和結構
在Redis中,無論是鍵key還是值value都是一個對象,每次對Redis數據庫創建一個新的鍵值對時,就至少會創建兩個對象。
常見的對象類型有:
- 字符串
- 列表
- 哈希
- 集合
- 有序集合
這些對象在Redis中統一用一個結構體redisObject來表示,只不過type屬性不同。
typeof struct redisObject {// 類型unsigned type;// 編碼格式 unsigned encoding;// 指向底層實現的數據結構的指針 void *ptr; // ....
} robj;
對這些對象的操作,在Redis中有對應的命令,這里就不說了。
內存回收
Redis的對象內存回收比較簡單,引用計數法
在redisObject結構體還有一個重要的變量是refcount
,用來表示對此對象的引用次數。
在剛創建一個新對象時,引用計數的值會被初始化為1;
當對象被一個新程序使用時,引用計數值加1;
當一個對象不再被一個程序使用時,引用計數值減1;
當引用計數變量為0時,表示沒有程序繼續引用此對象了,那么就需要回收此對象占用的內存。
對象共享
引用計數變量,除了實現內存回收機制外,還有對象共享的作用。
舉個例子,當key1已經創建了value是100的值對象,此時key2也要創建一個value是100的值對象,此時我們的認為有兩種做法:
- 為key2新創建一個value是100的對象
- 讓key2與key1共享同一個值對象
在Redis中,為了節約內存,采用了讓兩個key共享值對象的方式,具體的做法是:
- 讓key2指向現有的value對象
- 該value對象的引用計數加1
當數據庫中保存相同的值越多,那么對象共享的優勢就更明顯。