最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis內(nèi)存回收和對象共享的實(shí)現(xiàn)示例

 更新時(shí)間:2026年03月31日 09:05:34   作者:Nyarlathotep0113  
本文主要介紹了Redis內(nèi)存回收和對象共享的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Redis中的內(nèi)存回收

因?yàn)?C 語言并不具備自動(dòng)的內(nèi)存回收功能, 所以Redis在自己的對象系統(tǒng)中構(gòu)建了一個(gè)引用計(jì)數(shù)技術(shù)實(shí)現(xiàn)的內(nèi)存回收機(jī)制, 通過這一機(jī)制, 程序可以通過跟蹤對象的引用計(jì)數(shù)信息, 在適當(dāng)?shù)臅r(shí)候自動(dòng)釋放對象并進(jìn)行內(nèi)存回收

每個(gè)對象的引用計(jì)數(shù)信息由 redisObject 結(jié)構(gòu)的 refcount 屬性記錄:

typedef struct redisObject {
    // ...
    // 引用計(jì)數(shù)
    int refcount;
    // ...
} robj;

對象的引用計(jì)數(shù)信息會(huì)隨著對象的使用狀態(tài)而不斷變化

  • 在創(chuàng)建一個(gè)新對象時(shí), 引用計(jì)數(shù)的值會(huì)被初始化為 1 ;
  • 當(dāng)對象被一個(gè)新程序使用時(shí), 它的引用計(jì)數(shù)值會(huì)被增一;
  • 當(dāng)對象不再被一個(gè)程序使用時(shí), 它的引用計(jì)數(shù)值會(huì)被減一;
  • 當(dāng)對象的引用計(jì)數(shù)值變?yōu)?nbsp;0 時(shí), 對象所占用的內(nèi)存會(huì)被釋放。
函數(shù)作用
incrRefCount將對象的引用計(jì)數(shù)值增一。
decrRefCount將對象的引用計(jì)數(shù)值減一, 當(dāng)對象的引用計(jì)數(shù)值等于 0 時(shí), 釋放對象。
resetRefCount將對象的引用計(jì)數(shù)值設(shè)置為 0 , 但并不釋放對象, 這個(gè)函數(shù)通常在需要重新設(shè)置對象的引用計(jì)數(shù)值時(shí)使用。

對象的生命周期

對象的整個(gè)生命周期可以劃分為創(chuàng)建對象、操作對象釋放對象三個(gè)階段。

// 創(chuàng)建一個(gè)字符串對象 s ,對象的引用計(jì)數(shù)為 1
robj *s = createStringObject(...)
// 對象 s 執(zhí)行各種操作 ...
// 將對象 s 的引用計(jì)數(shù)減一,使得對象的引用計(jì)數(shù)變?yōu)?0
// 導(dǎo)致對象 s 被釋放
decrRefCount(s)

對象共享

對象的引用除了進(jìn)行內(nèi)存回收之外,還帶有對象共享的作用。

假設(shè)鍵A創(chuàng)建一個(gè)包含整數(shù)值100的字符串作為值對象

現(xiàn)在假設(shè)鍵B也要?jiǎng)?chuàng)建一個(gè)同樣的字符串作為值對象,有兩種做法:

  1. 為鍵 B 新創(chuàng)建一個(gè)包含整數(shù)值 100 的字符串對象;
  2. 讓鍵 A 和鍵 B 共享同一個(gè)字符串對象;

第二種方法是明顯優(yōu)于第一種方法的。

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

  1. 將數(shù)據(jù)庫鍵的值指針指向一個(gè)現(xiàn)有的值對象;
  2. 將被共享的值對象的引用計(jì)數(shù)增一。

共享對象機(jī)制對于節(jié)約內(nèi)存非常有幫助, 數(shù)據(jù)庫中保存的相同值對象越多, 對象共享機(jī)制就能節(jié)約越多的內(nèi)存。

Redis會(huì)在初始化服務(wù)器時(shí), 創(chuàng)建一萬個(gè)字符串對象, 這些對象包含了從 0 到 9999 的所有整數(shù)值, 當(dāng)服務(wù)器需要用到值為 0到 9999 的字符串對象時(shí), 服務(wù)器就會(huì)使用這些共享對象, 而不是新創(chuàng)建對象。

當(dāng)服務(wù)器考慮將一個(gè)共享對象設(shè)置為鍵的值對象時(shí), 程序需要先檢查給定的共享對象和鍵想創(chuàng)建的目標(biāo)對象是否完全相同, 只有在共享對象和目標(biāo)對象完全相同的情況下, 程序才會(huì)將共享對象用作鍵的值對象, 而一個(gè)共享對象保存的值越復(fù)雜, 驗(yàn)證共享對象和目標(biāo)對象是否相同所需的復(fù)雜度就會(huì)越高, 消耗的 CPU時(shí)間也會(huì)越多

  • 如果共享對象是保存整數(shù)值的字符串對象, 那么驗(yàn)證操作的復(fù)雜度為O(1);
  • 如果共享對象是保存字符串值的字符串對象, 那么驗(yàn)證操作的復(fù)雜度為O(N);
  • 如果共享對象是包含了多個(gè)值(或者對象的)對象, 比如列表對象或者哈希對象, 那么驗(yàn)證操作的復(fù)雜度將會(huì)是O(N2)  。

因此, 盡管共享更復(fù)雜的對象可以節(jié)約更多的內(nèi)存, 但受到CPU時(shí)間的限制,Redis 只對包含整數(shù)值的字符串對象進(jìn)行共享。

到此這篇關(guān)于Redis內(nèi)存回收和對象共享的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis 內(nèi)存回收和對象共享內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis簡易延時(shí)隊(duì)列的實(shí)現(xiàn)示例

    Redis簡易延時(shí)隊(duì)列的實(shí)現(xiàn)示例

    在實(shí)際的業(yè)務(wù)場景中,經(jīng)常會(huì)遇到需要延時(shí)處理的業(yè)務(wù),本文就來介紹有下Redis簡易延時(shí)隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Redis本地鎖和分布式鎖的區(qū)別小結(jié)

    Redis本地鎖和分布式鎖的區(qū)別小結(jié)

    Redis本地鎖和分布式鎖在設(shè)計(jì)目的、實(shí)現(xiàn)方式和應(yīng)用場景上都有顯著區(qū)別,下面就來介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性

    Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性

    本文主要介紹了Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • redis通過6379端口無法連接服務(wù)器(redis-server.exe閃退)

    redis通過6379端口無法連接服務(wù)器(redis-server.exe閃退)

    這篇文章主要介紹了redis通過6379端口無法連接服務(wù)器(redis-server.exe閃退),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis主從架構(gòu)和高可用性實(shí)現(xiàn)過程

    Redis主從架構(gòu)和高可用性實(shí)現(xiàn)過程

    本文詳細(xì)介紹了使用Redis主從架構(gòu)和Linux虛擬服務(wù)器(LVS)實(shí)現(xiàn)高可用性的方法,并回顧了最近完成的Redis集群遷移部署過程,主從架構(gòu)通過復(fù)制數(shù)據(jù)來提高性能和數(shù)據(jù)冗余,而LVS用于實(shí)現(xiàn)負(fù)載均衡和故障切換,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Redis分片集群的實(shí)現(xiàn)示例

    Redis分片集群的實(shí)現(xiàn)示例

    本文介紹了搭建Redis分片集群,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • redis?哨兵集群搭建的實(shí)現(xiàn)

    redis?哨兵集群搭建的實(shí)現(xiàn)

    本文主要介紹了redis?哨兵集群搭建的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • redis 用scan指令 代替keys指令(詳解)

    redis 用scan指令 代替keys指令(詳解)

    下面小編就為大家分享一篇redis 用scan指令 代替keys指令詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題

    Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題

    這篇文章主要介紹了Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • redis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

吕梁市| 公安县| 和田县| 太和县| 大渡口区| 吉木乃县| 藁城市| 济南市| 连州市| 星座| 阿尔山市| 青田县| 龙州县| 伊宁县| 江安县| 韶关市| 海南省| 安福县| 新乡市| 余江县| 辽宁省| 囊谦县| 汉寿县| 太仓市| 如东县| 宽城| 三门峡市| 阳谷县| 临湘市| 太康县| 大兴区| 明星| 许昌县| 香河县| 郓城县| 河津市| 体育| 福贡县| 彩票| 万载县| 岑巩县|