RedisRedisObject 對(duì)象

      網(wǎng)友投稿 835 2025-04-02

      在前面介紹各個(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é)果作為命令的返回值。

      【Redis】RedisObject 對(duì)象

      對(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)容。

      上一篇:甘特圖如何生成圖表 - 詳細(xì)指南和步驟
      下一篇:餐飲服務(wù)系統(tǒng)(餐飲服務(wù)系統(tǒng)圖)
      相關(guān)文章
      亚洲国产精品毛片av不卡在线| 亚洲精品乱码久久久久蜜桃 | 中文字幕亚洲精品资源网| 国产亚洲欧洲Aⅴ综合一区| 亚洲第一视频在线观看免费| 国产精品亚洲天堂| 日韩国产精品亚洲а∨天堂免| 亚洲精品无码中文久久字幕| 亚洲中文字幕一二三四区| 亚洲国产激情在线一区| 激情亚洲一区国产精品| 亚洲色欲色欲www| 亚洲综合一区国产精品| 亚洲色大成网站www久久九| 亚洲精品伦理熟女国产一区二区| 亚洲狠狠色丁香婷婷综合| 亚洲Av永久无码精品一区二区| 亚洲成a∧人片在线观看无码| 亚洲av日韩av永久无码电影| AV激情亚洲男人的天堂国语| 亚洲AⅤ永久无码精品AA| 亚洲综合久久夜AV | 亚洲色大成网站WWW久久九九| 亚洲愉拍99热成人精品热久久 | 久久精品国产亚洲av麻豆图片 | 亚洲女同成av人片在线观看 | 亚洲Av无码国产一区二区| 国产精品亚洲一区二区无码| 亚洲精品国精品久久99热| 国产亚洲色视频在线| 亚洲精品国产精品乱码不99| 亚洲av永久无码精品漫画| 亚洲高清资源在线观看| 精品亚洲成在人线AV无码| 亚洲中文字幕无码av永久| 国产精品亚洲精品日韩电影| 亚洲一区二区高清| 亚洲成人午夜在线| 亚洲人成777在线播放| 亚洲乱妇老熟女爽到高潮的片| 一区国严二区亚洲三区|