【Redis】RedisObject 對(duì)象
在前面介紹各個(gè)底層數(shù)據(jù)結(jié)構(gòu)時(shí)有提到, Redis 的每一種數(shù)據(jù)類型,比如字符串、列表、有序集, 它們都擁有不只一種底層實(shí)現(xiàn)(Redis 內(nèi)部稱之為編碼,encoding), 這說(shuō)明, 每當(dāng)對(duì)某種數(shù)據(jù)類型的鍵進(jìn)行操作時(shí), 程序都必須根據(jù)鍵所采取的編碼, 進(jìn)行不同的操作。
Redis 構(gòu)建了自己的類型系統(tǒng), 這個(gè)系統(tǒng)的主要功能包括:
redisObject 對(duì)象。
基于 redisObject 對(duì)象的類型檢查。
基于 redisObject 對(duì)象的顯式多態(tài)函數(shù)。
對(duì) redisObject 進(jìn)行分配、共享和銷毀的機(jī)制。
RedisObject
/* * Redis 對(duì)象 */ typedef struct redisObject { // 類型 記錄了對(duì)象所保存的值的類型 unsigned type:4; // 對(duì)齊位 unsigned notused:2; // 編碼方式 記錄了對(duì)象所保存的值的編碼 unsigned encoding:4; // LRU 時(shí)間 鍵的空轉(zhuǎn)時(shí)間 unsigned lru:22; // 引用計(jì)數(shù) int refcount; // 指向?qū)ο蟮闹?是一個(gè)指針,指向?qū)嶋H保存值的數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)由 type 屬性和 encoding 屬性決定。 void *ptr; } robj;
命令的類型檢查和多態(tài)
有了 redisObject 結(jié)構(gòu)的存在, 在執(zhí)行處理數(shù)據(jù)類型的命令時(shí), 進(jìn)行類型檢查和對(duì)編碼進(jìn)行多態(tài)操作就簡(jiǎn)單得多了。
當(dāng)執(zhí)行一個(gè)處理數(shù)據(jù)類型的命令時(shí), Redis 執(zhí)行以下步驟:
根據(jù)給定 key ,在數(shù)據(jù)庫(kù)字典中查找和它相對(duì)應(yīng)的 redisObject ,如果沒找到,就返回 NULL 。
檢查 redisObject 的 type 屬性和執(zhí)行命令所需的類型是否相符,如果不相符,返回類型錯(cuò)誤。
根據(jù) redisObject 的 encoding 屬性所指定的編碼,選擇合適的操作函數(shù)來(lái)處理底層的數(shù)據(jù)結(jié)構(gòu)。
返回?cái)?shù)據(jù)結(jié)構(gòu)的操作結(jié)果作為命令的返回值。
對(duì)象共享
Redis 預(yù)分配的值對(duì)象有如下這些:
各種命令的返回值,比如執(zhí)行成功時(shí)返回的 OK ,執(zhí)行錯(cuò)誤時(shí)返回的 ERROR ,類型錯(cuò)誤時(shí)返回的 WRONGTYPE ,命令入隊(duì)事務(wù)時(shí)返回的 QUEUED ,等等。
包括 0 在內(nèi),小于 redis.h/REDIS_SHARED_INTEGERS 的所有整數(shù)(REDIS_SHARED_INTEGERS 的默認(rèn)值為 10000)
因?yàn)槊畹幕貜?fù)值直接返回給客戶端, 所以它們的值無(wú)須進(jìn)行共享; 另一方面, 如果某個(gè)命令的輸入值是一個(gè)小于 REDIS_SHARED_INTEGERS 的整數(shù)對(duì)象, 那么當(dāng)這個(gè)對(duì)象要被保存進(jìn)數(shù)據(jù)庫(kù)時(shí), Redis 就會(huì)釋放原來(lái)的值, 并將值的指針指向共享對(duì)象
共享對(duì)象只能被帶指針的數(shù)據(jù)結(jié)構(gòu)使用。
需要提醒的一點(diǎn)是, 共享對(duì)象只能被字典和雙端鏈表這類能帶有指針的數(shù)據(jù)結(jié)構(gòu)使用。
像整數(shù)集合和壓縮列表這些只能保存字符串、整數(shù)等字面值的內(nèi)存數(shù)據(jù)結(jié)構(gòu), 就不能使用共享對(duì)象。
引用計(jì)數(shù)以及對(duì)象的銷毀
總結(jié)
Redis 使用自己實(shí)現(xiàn)的對(duì)象機(jī)制來(lái)實(shí)現(xiàn)類型判斷、命令多態(tài)和基于引用計(jì)數(shù)的垃圾回收。
一種 Redis 類型的鍵可以有多種底層實(shí)現(xiàn)。
Redis 會(huì)預(yù)分配一些常用的數(shù)據(jù)對(duì)象,并通過(guò)共享這些對(duì)象來(lái)減少內(nèi)存占用,和避免頻繁地為小對(duì)象分配內(nèi)存
Redis 數(shù)據(jù)結(jié)構(gòu)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。