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

Redis三種常用的緩存讀寫策略步驟詳解

 更新時間:2022年05月06日 15:03:50   作者:晴天的空間  
Redis有三種讀寫策略分別是:旁路緩存模式策略、讀寫穿透策略、異步緩存寫入策略,接下來通過本文給大家詳細介紹下Redis三種常用的緩存讀寫策略,感興趣的朋友一起看看吧

一、Redis三種常用的緩存讀寫策略

Redis有三種讀寫策略分別是:旁路緩存模式策略、讀寫穿透策略、異步緩存寫入策略。

這三種緩存讀寫策略各有優(yōu)勢,不存在最佳,需要我們根據(jù)實際的業(yè)務(wù)場景選擇最合適的。

二、旁路緩存模式(Cache Aside Pattern)

旁路緩存模式是我們平時使用比較多的一個緩存讀寫模式,比較適合讀請求比較多的場景。

旁路緩存模式中服務(wù)端需要同時維護DBCache,并且是以DB的結(jié)果為準。

讀寫步驟

寫:

  • 先更新DB。
  • 然后直接刪除cache。

如下圖:

讀:

  • cache中讀取數(shù)據(jù),讀取到就直接返回。
  • cache中讀取不到的話,就從DB讀取返回。
  • 再把數(shù)據(jù)寫到cache中。

如下圖:

自我思考

思考這樣子的一個問題:“如果在寫數(shù)據(jù)的過程中,可以先刪除cache,再更新DB嗎?

答案: 答案肯定是不行的,因為這樣子可能造成數(shù)據(jù)庫和緩存數(shù)據(jù)不一致的問題,比如這個時候有一個數(shù)據(jù)在DB和緩存都為100,請求1需要將這個數(shù)據(jù)更新寫成200,如果先刪除換出再更新數(shù)據(jù)庫的話,在請求1已經(jīng)刪除緩存但是數(shù)據(jù)庫還沒寫完的時候,有一個請求2讀取數(shù)據(jù),首先去緩存讀取,發(fā)現(xiàn)緩存被刪除了,然后去數(shù)據(jù)庫讀取得到100(這個時候請求1還沒寫完)再寫入緩存,這個時候請求1寫完了,這個時候數(shù)據(jù)庫里數(shù)據(jù)為200,緩存里為100,不一致。

可以簡單描述為:

請求1先把cache中的數(shù)據(jù)刪除 -> 請求2從DB中讀取數(shù)據(jù) -> 請求1再把DB中的數(shù)據(jù)更新

緊接著思考:“在寫數(shù)據(jù)的過程中,如果先寫B(tài)D,再刪除cache就不會造成數(shù)據(jù)不一致了嗎?

答案: 理論上來說還是會出現(xiàn)數(shù)據(jù)不一致的問題,不過概率很小,因為緩存的寫入速度是比數(shù)據(jù)庫寫入速度快很多。

比如請求1先讀數(shù)據(jù)A,請求2隨后寫數(shù)據(jù)A,并且數(shù)據(jù)A不在緩存中存在的話就會去數(shù)據(jù)庫讀取,讀取完請求2再更新完并刪除緩存,然后請求1把數(shù)據(jù)A寫入緩存,這個時候數(shù)據(jù)庫和緩存就不一致了。

這個過程可以簡單的描述為:

請求1從DB讀取數(shù)據(jù)A -> 請求2寫更新數(shù)據(jù)A到數(shù)據(jù)庫再刪除cache中的A數(shù)據(jù) -> 請求1將數(shù)據(jù)A寫入緩存

缺點

  • 首次請求的數(shù)據(jù)一定不在cache的問題

    解決辦法:可以將熱點數(shù)據(jù)提前寫入cache中。

  • 寫操作比較頻繁的話導(dǎo)致cache中的數(shù)據(jù)會被頻繁的刪除,這樣會影響緩存命中率。

    解決辦法:

    • 數(shù)據(jù)庫和緩存強一直場景:更新DB的時候同樣更新cache,不過需要加一個鎖/分布式鎖來保證更新cache的時候不存在線程安全問題。
    • 可以短暫的允許數(shù)據(jù)庫和緩存數(shù)據(jù)不一致的場景:更新DB的時候同樣更新cache,但是給緩存加一個比較短的過期時間,這樣的話就可以保證即使數(shù)據(jù)不一致的話影響也比較小。

三、讀寫穿透(Read/Write Through Pattern)

讀寫穿透中服務(wù)端把cache視為主要數(shù)據(jù)存儲,從中讀取數(shù)據(jù)并將數(shù)據(jù)寫入其中。cache服務(wù)負責(zé)將此數(shù)據(jù)讀取和寫入DB,從而減輕應(yīng)用程序的職責(zé)。

讀寫步驟

寫:

  • 先查cachecache中不存在,直接更新DB。
  • cache中存在,則先更新cache,然后cache服務(wù)自己更新DB(同時更新DBcache)。

如下圖:

讀:

  • 先從cache中讀取數(shù)據(jù),讀取到直接返回。
  • cache中讀取不到,則先從DB加載寫入到cache后返回響應(yīng)。

如下圖:

讀寫穿透實際是在旁路緩存之上進行了封裝。在旁路緩存下,發(fā)生讀請求的時候,如果cache中不存在對應(yīng)的數(shù)據(jù),是由客戶端自己負責(zé)把數(shù)據(jù)寫入cache,而讀寫穿透則是cache服務(wù)自己來寫入緩存,這對客戶端是透明的。

和旁路緩存一樣,讀寫穿透也存在首次請求數(shù)據(jù)一定不在cache中的問題,對于熱點數(shù)據(jù)可以提前寫入緩存中。

四、異步緩存寫入(Write Behind Pattern)

異步緩存寫入和讀寫穿透很相似,兩者都是由cache服務(wù)來負責(zé)cacheDB的讀寫。

兩者最大的不同點就是:讀寫穿透是同步更新DBcache,而異步緩存寫入則是只更新cache,不直接更新DB,而是改為異步批量的方式更新DB。

很明顯,這種方式對數(shù)據(jù)一致性帶來了更大的挑戰(zhàn),比如cache數(shù)據(jù)可能還沒異步更新DB,cache服務(wù)可能就掛了。

這種策略在我們平時開發(fā)過程中也非常少見,但是不代表它的應(yīng)用場景少,比如消息隊列中消息的異步寫入磁盤、MySQLInnoDB Buffer Pool機制都用到了這種策略。

異步緩存寫入的寫性能非常高,非常適合寫數(shù)據(jù)經(jīng)常變化又對數(shù)據(jù)一致性要求沒那么高的場景下使用,比如瀏覽量、點贊量等。

參考:javaguide.cn/database/re…

到此這篇關(guān)于Redis三種常用的緩存讀寫策略的文章就介紹到這了,更多相關(guān)Redis緩存讀寫策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis之sql緩存的具體使用

    Redis之sql緩存的具體使用

    本文主要介紹了Redis之sql緩存的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Redis?存儲對象信息用?Hash?和String的區(qū)別

    Redis?存儲對象信息用?Hash?和String的區(qū)別

    這篇文章主要介紹了Redis存儲對象信息用Hash和String的區(qū)別,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Redis與緩存解讀

    Redis與緩存解讀

    文章介紹了Redis作為緩存層的優(yōu)勢和缺點,并分析了六種緩存更新策略,包括超時剔除、先刪緩存再更新數(shù)據(jù)庫、旁路緩存、先更新數(shù)據(jù)庫再刪緩存、先更新數(shù)據(jù)庫再更新緩存、讀寫穿透和異步緩存寫入模式,還討論了緩存常見問題
    2025-01-01
  • 線上Redis一直報連接超時該如何解決

    線上Redis一直報連接超時該如何解決

    這篇文章主要為大家詳細介紹了項目開發(fā)時如果出現(xiàn)線上Redis一直報連接超時的問題該如何解決,文中的示例代碼簡潔易懂,需要的小伙伴可以借鑒一下
    2023-08-08
  • RedisTemplate集成+封裝RedisUtil過程

    RedisTemplate集成+封裝RedisUtil過程

    本文介紹了如何搭建一個多模塊的Redis項目,包括項目搭建、配置和測試,通過使用父項目管理多個子模塊,可以實現(xiàn)單點構(gòu)建、統(tǒng)一版本管理和清晰的項目結(jié)構(gòu),文章還提供了在Spring Boot項目中集成RedisTemplate的示例,并解決了編碼問題
    2024-12-12
  • 關(guān)于redisson緩存序列化的幾枚大坑說明

    關(guān)于redisson緩存序列化的幾枚大坑說明

    這篇文章主要介紹了redisson緩存序列化幾枚大坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 保證Redis中存儲的Token安全性的示例詳解

    保證Redis中存儲的Token安全性的示例詳解

    確保Redis中存儲的Token安全性是一個多層面的任務(wù),涉及到網(wǎng)絡(luò)、應(yīng)用、數(shù)據(jù)和操作等多個方面的安全措施,本文給大家介紹了一些詳細的實踐建議和示例,并有詳細的代碼供大家參考,需要的朋友可以參考下
    2024-03-03
  • 通過prometheus監(jiān)控redis實時運行狀態(tài)的操作方法

    通過prometheus監(jiān)控redis實時運行狀態(tài)的操作方法

    本文詳細介紹了如何通過Prometheus監(jiān)控Redis的運行狀態(tài),包括安裝配置Redis、Redis Exporter以及Prometheus,配置Prometheus監(jiān)控Redis指標,以及常見的Redis指標和告警規(guī)則,需要的朋友可以參考下
    2025-02-02
  • Redis集群設(shè)置密碼訪問的實現(xiàn)

    Redis集群設(shè)置密碼訪問的實現(xiàn)

    本文檔介紹了在Redis集群上配置和管理密碼,包括為每個節(jié)點添加requirepass配置以啟用密碼保護,及通過redis-cli關(guān)閉集群時使用密碼,感興趣的可以了解一下
    2025-08-08
  • Redis接口訪問優(yōu)化的方法步驟

    Redis接口訪問優(yōu)化的方法步驟

    本文基于之前的Redis接口訪問進行優(yōu)化,引入了接口防抖功能,通過時間段參數(shù)限制接口調(diào)用頻率,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10

最新評論

常山县| 聂拉木县| 镇沅| 滨海县| 新密市| 徐州市| 秦皇岛市| 巴塘县| 平果县| 嫩江县| 永宁县| 河池市| 康保县| 蕉岭县| 康马县| 蒲江县| 大名县| 屯昌县| 双城市| 银川市| 余干县| 溧阳市| 安远县| 博兴县| 云浮市| 田林县| 齐齐哈尔市| 南京市| 水富县| 册亨县| 建德市| 喀喇沁旗| 翼城县| 安仁县| 呼玛县| 荣成市| 时尚| 海晏县| 海南省| 蓬莱市| 峨眉山市|