欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

讀寫步驟

寫:

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

如下圖:

讀:

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

如下圖:

自我思考

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

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

可以簡單描述為:

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

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

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

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

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

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

缺點

  • 首次請求的數據一定不在cache的問題

    解決辦法:可以將熱點數據提前寫入cache中。

  • 寫操作比較頻繁的話導致cache中的數據會被頻繁的刪除,這樣會影響緩存命中率。

    解決辦法:

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

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

讀寫穿透中服務端把cache視為主要數據存儲,從中讀取數據并將數據寫入其中。cache服務負責將此數據讀取和寫入DB,從而減輕應用程序的職責。

讀寫步驟

寫:

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

如下圖:

讀:

  • 先從cache中讀取數據,讀取到直接返回。
  • cache中讀取不到,則先從DB加載寫入到cache后返回響應。

如下圖:

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

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

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

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

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

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

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

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

參考:javaguide.cn/database/re…

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

相關文章

  • Redis恢復被移除集群的服務器實操步驟

    Redis恢復被移除集群的服務器實操步驟

    這篇文章主要為大家介紹了Redis恢復被移除集群的服務器實操步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Redis中3種特殊的數據類型(BitMap、Geo和HyperLogLog)

    Redis中3種特殊的數據類型(BitMap、Geo和HyperLogLog)

    這篇文章主要給大家介紹了關于Redis中3種特殊的數據類型(BitMap、GEOADD和GEODIST)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • 用Redis實現微博關注關系

    用Redis實現微博關注關系

    在微博中,每一個用戶都會有一個關注列表,一個粉絲列表。用戶可以查看自己的關注,粉絲列表,也可以查看別人的關注,粉絲列表。并且,要展示列表里每個人與當前查看者的關注狀態(tài)。
    2015-09-09
  • Redis事務為什么不支持回滾

    Redis事務為什么不支持回滾

    事務是關系型數據庫的特征之一,那么作為 Nosql 的代表 Redis 中有事務嗎?如果有,那么 Redis 當中的事務又是否具備關系型數據庫的 ACID 四大特性,本文就來詳細介紹一下
    2021-08-08
  • Redis緩存三大異常的處理方案梳理總結

    Redis緩存三大異常的處理方案梳理總結

    這篇文章主要介紹了Redis緩存三大異常的處理方案梳理總結,緩存方式,在提高數據查詢效率、保護數據庫等方面起到了不可磨滅的作用,但實際應用中,可能會出現一些Redis緩存異常的情況,下文對其方案總結需要的朋友可以參考一下
    2022-06-06
  • 如何自定義redis工具jar包供其他SpringBoot項目直接使用

    如何自定義redis工具jar包供其他SpringBoot項目直接使用

    這篇文章主要介紹了如何自定義redis工具jar包供其他SpringBoot項目直接使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Redis中秒殺場景下超時與超賣問題的解決方案

    Redis中秒殺場景下超時與超賣問題的解決方案

    當我們在linux中使用ab來模擬高并發(fā)秒殺時可能會遇到兩種問題,“超時和超賣”,本文就詳細介紹了Redis中秒殺場景下超時與超賣問題的解決方案,感興趣的可以了解一下
    2022-05-05
  • Redis教程(十五):C語言連接操作代碼實例

    Redis教程(十五):C語言連接操作代碼實例

    這篇文章主要介紹了Redis教程(十五):C語言連接操作代碼實例,本篇博客是該系列博客中的最后一篇,在這里將給出基于Redis客戶端組件訪問并操作Redis服務器的代碼示例,需要的朋友可以參考下
    2015-05-05
  • Redis線程模型的原理分析

    Redis線程模型的原理分析

    Redis是一個高性能的數據存儲框架,在高并發(fā)的系統(tǒng)設計中,Redis也是一個比較關鍵的組件,是我們提升系統(tǒng)性能的一大利器,本文詳細的介紹了Redis線程模型,感興趣的可以了解一
    2021-11-11
  • 詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案

    詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案

    緩存可以比喻為防彈衣,但如果沒有使用好這個防彈衣效果就會適得其反,所以要更好的使用緩存才能發(fā)揮出它的作用。本文詳細講解了緩存穿透/擊穿/雪崩以及其解決方法,感興趣的小伙伴可以學習一下這篇文章
    2021-09-09

最新評論