国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis緩存問題與緩存更新機制

這篇具有很好參考價值的文章主要介紹了Redis緩存問題與緩存更新機制。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Redis緩存問題與緩存更新機制,NoSQL,# Redis,緩存,redis,數(shù)據(jù)庫

目錄

?編輯

?一、緩存問題

?1.1 緩存穿透

?1.1.1 問題來源

?1.1.2 解決方案

?1.1.2.1 緩存空對象

?1.1.2.2 使用布隆過濾器

?1.2 緩存擊穿

?1.2.1 問題來源

?1.2.2 解決方案

?1.2.2.1 設置熱點數(shù)據(jù)永遠不過期

?1.2.2.2 新增后臺定時更新緩存線程(邏輯不過期)

?1.2.2.3 使用分布式互斥鎖

?1.2.2.4 接口限流與熔斷,降級

?1.3 緩存雪崩

?1.3.1 問題來源

?1.3.2 解決方案

?1.3.2.1 緩存過期時間隨機

?1.3.2.2 分布式部署

?1.3.2.3 設置熱點數(shù)據(jù)永遠不過期

?1.3.2.4 接口限流與熔斷,降級

?二、緩存更新機制

2.1 緩存更新策略分類

?2.2 內(nèi)存淘汰機制

?2.2.1 noeviction

?2.2.2 volatile-lru

?2.2.3 volatile-lfu

?2.2.4 volatile-ttl

?2.2.5 volatile-random

?2.2.6 allkey-lru

?2.2.7 allkey-lfu

?2.2.8 allkey-random

?2.3 超時剔除

?2.3.1 定時刪除

?2.3.2 惰性刪除

?2.4 主動更新

?2.4.1 主動更新策略

?2.4.1.1 Cache Aside Pattern

?2.4.1.2 Read/Write Through Pattern

?2.4.1.3 Write Behind Caching Pattern

?2.4.2 主動更新策略需要考慮的三個問題

?2.4.1 刪除緩存還是更新緩存?

?2.4.1.1 刪除緩存

?2.4.1.2 更新緩存

?2.4.2 如何保證緩存與數(shù)據(jù)庫的操作同時成功或失???

?2.4.3 先操作緩存還是數(shù)據(jù)庫?

?2.4.3.1 先刪除緩存,再操作數(shù)據(jù)庫

2.4.3.2 先操作數(shù)據(jù)庫,再刪除緩存

2.4.3.3 延時雙刪策略

?2.5 緩存更新機制總結(jié)


?一、緩存問題

?1.1 緩存穿透

?1.1.1 問題來源

緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求。由于緩存是不命中時被動寫的,并且出于容錯考慮,如果從存儲層查不到數(shù)據(jù)則不寫入緩存,這將導致這個不存在的數(shù)據(jù)每次請求都要到存儲層去查詢,失去了緩存的意義。在流量大時,可能DB就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。

?1.1.2 解決方案

?1.1.2.1 緩存空對象

從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫中也沒有取到,這時也可以將key-value對寫為key-null,緩存有效時間可以設置短點,如30秒(設置太長會導致正常情況也沒法使用)。這樣可以防止攻擊用戶反復用同一個id暴力攻擊。

?1.1.2.2 使用布隆過濾器

類似于一個hash set,用于快速判某個元素是否存在于集合中,其典型的應用場景就是快速判斷一個key是否存在于某容器,不存在就直接返回。布隆過濾器的關鍵就在于hash算法和容器大小。

?1.2 緩存擊穿

?1.2.1 問題來源

緩存擊穿是指緩存某些熱點數(shù)據(jù)失效(一般是緩存時間到期),這時由于并發(fā)用戶特別多,同時讀緩存沒讀到數(shù)據(jù),又同時去數(shù)據(jù)庫去取數(shù)據(jù),引起數(shù)據(jù)庫壓力瞬間增大,造成過大壓力。

?1.2.2 解決方案

?1.2.2.1 設置熱點數(shù)據(jù)永遠不過期

可以在刷緩存時,設置熱點數(shù)據(jù)不過期。

?1.2.2.2 新增后臺定時更新緩存線程(邏輯不過期)

后臺新增一個緩存更新線程,緩存快要過期前刷新緩存時間,防止緩存失效。

?1.2.2.3 使用分布式互斥鎖

可以使用Redis提供的分布式互斥鎖,保證只有一個請求查詢數(shù)據(jù)庫和更新緩存,其他請求阻塞等待緩存更新完成后在訪問緩存。

?1.2.2.4 接口限流與熔斷,降級

重要的接口一定要做好限流策略,防止用戶惡意刷接口,同時要降級準備,當接口中的某些服務不可用時候,進行熔斷,失敗快速返回機制。

?1.3 緩存雪崩

?1.3.1 問題來源

緩存雪崩是指Redis緩存不能正常提供服務了(阻塞、服務宕機、大面積緩存失效等造成),導致所有請求都落到了數(shù)據(jù)庫上,增加了數(shù)據(jù)庫壓力或者導致數(shù)據(jù)庫宕機。

?1.3.2 解決方案

?1.3.2.1 緩存過期時間隨機

緩存數(shù)據(jù)的過期時間設置隨機,防止同一時間大量數(shù)據(jù)過期現(xiàn)象發(fā)生。

?1.3.2.2 分布式部署

采用分布式部署方式部署緩存,避免緩存服務單節(jié)點,同時將熱點數(shù)據(jù)均勻分布在不同的緩存數(shù)據(jù)庫中。

?1.3.2.3 設置熱點數(shù)據(jù)永遠不過期

可以在刷緩存時,設置熱點數(shù)據(jù)不過期。

?1.3.2.4 接口限流與熔斷,降級

重要的接口一定要做好限流策略,防止用戶惡意刷接口,同時要降級準備,當接口中的某些服務不可用時候,進行熔斷,失敗快速返回機制。

?二、緩存更新機制

2.1 緩存更新策略分類

內(nèi)存淘汰 超時剔除 主動更新
說明 重要的接口一定要做好限流策略,防止用戶惡意刷接口,同時要降級準備,當接口中的某些服務不可用時候,進行熔斷,失敗快速返回機制。 給緩存數(shù)據(jù)添加TTL時間,到期后自動刪除緩存,下次查詢時更新緩存 編寫業(yè)務邏輯,在修改數(shù)據(jù)的同時,更新緩存
一致性 一般
維護成本

?2.2 內(nèi)存淘汰機制

?2.2.1 noeviction

不淘汰,這是默認的淘汰策略;當內(nèi)存達到限制后,寫請求(set)會返回錯誤,讀請求(get)和刪除請求(del)可以繼續(xù)進行

?2.2.2 volatile-lru

內(nèi)存不足時,在設置了過期時間的key中,優(yōu)先刪除最近最少使用的key

?2.2.3 volatile-lfu

內(nèi)存不足時,在設置了過期時間的key中,優(yōu)先刪除使用頻率最少的key

?2.2.4 volatile-ttl

內(nèi)存不足時,在設置了過期時間的key中,優(yōu)先刪除存活剩余時間最少的key

?2.2.5 volatile-random

內(nèi)存不足時,在設置了過期時間的key中,隨機刪除某個key

?2.2.6 allkey-lru

內(nèi)存不足時,在全體key范圍內(nèi),優(yōu)先刪除最近最少使用的key

?2.2.7 allkey-lfu

內(nèi)存不足時,在全體key范圍內(nèi),優(yōu)先刪除使用頻率最少的key

?2.2.8 allkey-random

內(nèi)存不足時,在全體key范圍內(nèi),隨機刪除某個key

?2.3 超時剔除

?2.3.1 定時刪除

設置一個定時任務,隨機抽取部分過期時間的key,檢查是否過期,過期了就清除掉

?2.3.2 惰性刪除

查詢獲取數(shù)據(jù)時,檢查緩存是否過期,過期則刪除,沒過期不刪除

Redis 默認采用惰性刪除+定時刪除結(jié)合的過期策略

?2.4 主動更新

?2.4.1 主動更新策略

?2.4.1.1 Cache Aside Pattern

由緩存的調(diào)用者,在更新數(shù)據(jù)庫的同時更新緩存。

?2.4.1.2 Read/Write Through Pattern

緩存和數(shù)據(jù)庫整合為一個服務,由服務來維護一致性。調(diào)用者調(diào)用服務,不用關心一致性問題。

?2.4.1.3 Write Behind Caching Pattern

調(diào)用者只操作緩存,由其他線程異步的將緩存數(shù)據(jù)持久化到數(shù)據(jù)庫,最終保持一致。

在企業(yè)中使用最多的主動更新策略是 Cache Aside Pattern。也就是我們自己編碼來保證數(shù)據(jù)的一致性。

?2.4.2 主動更新策略需要考慮的三個問題

?2.4.1 刪除緩存還是更新緩存?
?2.4.1.1 刪除緩存

更新數(shù)據(jù)庫時讓緩存失效,查詢時再更新緩存。(延遲加載)一般選擇這個方案。

這個方案比較合理一點,可以避免過多的無效寫操作,緩存刪除后,只要沒人來查詢這條數(shù)據(jù),數(shù)據(jù)就不會被寫入緩存,這樣就可以避免大量無效的寫操作

?2.4.1.2 更新緩存

每次更新數(shù)據(jù)庫都更新緩存,無效寫操作比較多。

這種方式的缺點很明顯,舉個例子:假如我更新了100次數(shù)據(jù)庫,然后又同時更新了100次緩存,但是在更新的時候并沒有人來查這個數(shù)據(jù),那么我更新這100次緩存好像也沒啥用吧,相當于前99次都是無用功,只有最后一次才是有用的。這就是無效寫操作過多的原因。

?2.4.2 如何保證緩存與數(shù)據(jù)庫的操作同時成功或失???

1)單體系統(tǒng),將緩存與數(shù)據(jù)庫操作放在一個事務中。

2)分布式系統(tǒng),利用TCC等分布式事務方案。

?2.4.3 先操作緩存還是數(shù)據(jù)庫?
?2.4.3.1 先刪除緩存,再操作數(shù)據(jù)庫

Redis緩存問題與緩存更新機制,NoSQL,# Redis,緩存,redis,數(shù)據(jù)庫

這種方式存在很明顯的問題,假設有兩個并發(fā)操作,線程A更新,線程B查詢。線程A先刪除緩存,然后還沒來得及更新數(shù)據(jù)庫,CPU資源被線程B搶走,線程B查詢緩存發(fā)現(xiàn)沒有命中(因為已經(jīng)被線程A刪除了),查詢數(shù)據(jù)庫,然后把結(jié)果寫入到緩存中。這個時候線程A終于搶到CPU資源了,然后更新數(shù)據(jù)庫,此時就會造成數(shù)據(jù)不一致問題。

2.4.3.2 先操作數(shù)據(jù)庫,再刪除緩存

Redis緩存問題與緩存更新機制,NoSQL,# Redis,緩存,redis,數(shù)據(jù)庫

這種處理方式使用的頻率是最高的,因為出錯的概率非常小,只有一種比較極端的情況才會出現(xiàn)數(shù)據(jù)一致性問題。

同樣有兩個并發(fā)請求,線程A查詢、線程B更新,當線程A查詢的時候,緩存剛好失效,然后就去查詢數(shù)據(jù)庫拿到數(shù)據(jù),在準備寫入緩存的時候,CPU資源被線程B搶走,線程B開始更新數(shù)據(jù)庫,然后刪除緩存(這一步其實等于無用,因為緩存已經(jīng)過期)。此時線程A再次獲取到CPU資源,然后寫入緩存,此時寫入的是更新前的舊數(shù)據(jù),會產(chǎn)生數(shù)據(jù)一致性問題。

看起來這確實也是一個問題,但是我們仔細分析一下這種情況都需要滿足哪些條件:

1)并發(fā)讀寫操作
2)讀緩存時,緩存剛好失效
3)寫數(shù)據(jù)庫操作要比寫緩存快

寫數(shù)據(jù)庫是操作磁盤,寫緩存是操作內(nèi)存的,所以不太可能會出現(xiàn)寫磁盤的速度快于寫內(nèi)存的。因此使用這種方式出現(xiàn)數(shù)據(jù)一致性的概率是很小的。

2.4.3.3 延時雙刪策略

?Redis緩存問題與緩存更新機制,NoSQL,# Redis,緩存,redis,數(shù)據(jù)庫

延遲雙刪策略是分布式系統(tǒng)中數(shù)據(jù)庫存儲和緩存數(shù)據(jù)保持一致性的常用策略,但它不是強一致。其實不管哪種方案,都避免不了Redis存在臟數(shù)據(jù)的問題,只能減輕這個問題,要想徹底解決,得要用到同步鎖和對應的業(yè)務邏輯層面解決。

前面兩種方案的不足點我們進行了分析,第二種方式的使用頻率比較高,但是也有一些小缺陷,雖然說發(fā)生的概率很低,但是這個概率到了線上會不會發(fā)生也不好說,所以就有了延時雙刪策略對第二種方式做補充。

所謂延時雙刪就是先進行緩存清除,再執(zhí)行數(shù)據(jù)庫操作,最后(延遲N秒)再執(zhí)行緩存清除。延遲N秒的時間要大于一次寫操作的時間,這個延時N秒就是了完善保證第二種策略中不足,可以保證線程A的寫緩存和線程B的修改數(shù)據(jù)庫、刪除緩存都執(zhí)行完畢,然后再刪除緩存一次,就可以保證后面再來的查詢請求可以查詢到最新數(shù)據(jù)。

ps: 一般的延時時間設置為3S左右,具體情況要根據(jù)業(yè)務場景取最佳值。

?2.5 緩存更新機制總結(jié)

1)內(nèi)存淘汰:不用自己維護,利用Redis內(nèi)存淘汰機制,自動刪除部分緩存數(shù)據(jù),這些被刪除的數(shù)據(jù)在下一次被查詢時更新。這種方式一致性最差。

2)超時剔除:給緩存數(shù)據(jù)加上過期時間 ,到期后自動刪除,下次查詢時更新,數(shù)據(jù)一致性問題大概率會出現(xiàn)。維護成本比較低。

3)主動更新:編寫業(yè)務邏輯,在修改數(shù)據(jù)庫的同時更新緩存,一致性比較好,維護成本比較高。一般采用先操作數(shù)據(jù)庫再更新緩存的方式。

一般在數(shù)據(jù)一致性要求比較低的場景下可以使用內(nèi)存淘汰機制,比如商城首頁的分類信息,這些東西基本上是不會變化的。如果一致性要求比較高,我們可以采用主動更新+超時剔除兜底的方式來處理。

如果覺得對您有幫助,歡迎點贊+收藏+關注!文章來源地址http://www.zghlxwxcb.cn/news/detail-521562.html

到了這里,關于Redis緩存問題與緩存更新機制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • springboot+redis+mysql+quartz-通過Java操作redis的KEYS*命令獲取緩存數(shù)據(jù)定時更新數(shù)據(jù)庫

    代碼講解: 3-點贊功能-定時持久化到數(shù)據(jù)庫(pipeline+lua)-完善過程2_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1w14y1o7BV 本文章代碼: blogLike_schedule/like03 · xin麒/XinQiUtilsOrDemo - 碼云 - 開源中國 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like03 數(shù)據(jù)

    2024年02月15日
    瀏覽(31)
  • Redis 原理緩存過期、一致性hash、雪崩、穿透、并發(fā)、布隆、緩存更新策略、緩存數(shù)據(jù)庫一致性

    Redis 原理緩存過期、一致性hash、雪崩、穿透、并發(fā)、布隆、緩存更新策略、緩存數(shù)據(jù)庫一致性

    redis的過期策略可以通過配置文件進行配置 redis會把設置了過期時間的key放在單獨的字典中,定時遍歷來刪除到期的key。 1).每100ms從過期字典中 隨機挑選20個,把其中過期的key刪除; 2).如果過期的key占比超過1/4,重復步驟1 為了保證不會循環(huán)過度,導致卡頓,掃描時間上限

    2024年02月08日
    瀏覽(31)
  • springboot+redis+mysql+quartz-使用pipeline+lua技術將緩存數(shù)據(jù)定時更新到數(shù)據(jù)庫

    代碼講解:7.3點贊功能-定時持久化到數(shù)據(jù)庫-Java程序整合pipeline+lua_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1Lg4y1w7U9 代碼: blogLike_schedule/like08 · xin麒/XinQiUtilsOrDemo - 碼云 - 開源中國 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like08 數(shù)據(jù)庫表:

    2024年02月13日
    瀏覽(18)
  • springboot+redis+mysql+quartz-通過Java操作jedis使用pipeline獲取緩存數(shù)據(jù)定時更新數(shù)據(jù)庫

    springboot+redis+mysql+quartz-通過Java操作jedis使用pipeline獲取緩存數(shù)據(jù)定時更新數(shù)據(jù)庫

    代碼講解:6-點贊功能-定時持久化到數(shù)據(jù)庫-pipeline+lua-優(yōu)化pipeline_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1yP411C7dr 代碼: blogLike_schedule/like06 · xin麒/XinQiUtilsOrDemo - 碼云 - 開源中國 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like06 數(shù)據(jù)庫表的

    2024年02月16日
    瀏覽(28)
  • Redis 數(shù)據(jù)庫 NoSQL

    Redis 數(shù)據(jù)庫 NoSQL

    目錄 一、NoSQL 二、為什么會出現(xiàn)NoSQL技術 三、NoSQL的類別 鍵值(Key-Value)存儲數(shù)據(jù)庫 列存儲數(shù)據(jù)庫 文檔型數(shù)據(jù)庫 圖形(Graph)數(shù)據(jù)庫 四、NoSQL適應場景 五、在分布式數(shù)據(jù)庫中CAP原理 1、CAP 2、BASE NoSQL(Not Only SQL)即不僅僅是SQL,泛指非關系型的數(shù)據(jù)庫,它可以作為關系型數(shù)

    2024年02月12日
    瀏覽(25)
  • Redis如何保障緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性問題?

    Redis如何保障緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性問題?

    目錄 一.最經(jīng)典的數(shù)據(jù)庫加緩存的雙寫雙刪模式 二. 高并發(fā)場景下的緩存+數(shù)據(jù)庫雙寫不一致問題分析與解決方案設計 三、上面高并發(fā)的場景下,該解決方案要注意的問題 1.1 Cache Aside Pattern概念以及讀寫邏輯 (1)讀的時候,先讀緩存,緩存沒有的話,那么就讀數(shù)據(jù)庫,然后取

    2023年04月21日
    瀏覽(29)
  • springboot+redis+mysql+quartz-通過Java操作jedis定時使用lua腳本獲取緩存數(shù)據(jù)并更新數(shù)據(jù)庫

    springboot+redis+mysql+quartz-通過Java操作jedis定時使用lua腳本獲取緩存數(shù)據(jù)并更新數(shù)據(jù)庫 代碼講解:7.1點贊功能-定時持久化到數(shù)據(jù)庫-Java整合lua_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1ZX4y1H7JT/ 代碼: blogLike_schedule/like07 · xin麒/XinQiUtilsOrDemo - 碼云 - 開源中國 (gitee.com) https://gitee

    2024年02月13日
    瀏覽(17)
  • 如何保證Redis緩存和數(shù)據(jù)庫的一致性問題

    熟練掌握Redis緩存技術? 那么請問Redis緩存中有幾種讀寫策略,又是如何保證與數(shù)據(jù)庫的一致性問題 今天來聊一聊常用的三種緩存讀寫策略 首先我們來思考一個問題 寫 先更新緩存 再更新數(shù)據(jù)庫 首先如果緩存更新成功但數(shù)據(jù)庫更新失敗,會導致數(shù)據(jù)不一致的問題 其次當請求

    2024年02月14日
    瀏覽(23)
  • NoSQL數(shù)據(jù)庫介紹+Redis部署

    NoSQL數(shù)據(jù)庫介紹+Redis部署

    目錄 一、NoSQL概述 1、數(shù)據(jù)的高并發(fā)讀寫 2、海量數(shù)據(jù)的高效率存儲和訪問 3、數(shù)據(jù)庫的高擴展和高可用 二、NoSQL的類別 1、鍵值存儲數(shù)據(jù)庫 2、列存儲數(shù)據(jù)庫 3、文檔型數(shù)據(jù)庫 4、圖形化數(shù)據(jù)庫 三、分布式數(shù)據(jù)庫中的CAP原理 1、傳統(tǒng)的ACID 1)、A--原子性 2)、C--一致性 3)、I--隔

    2024年02月11日
    瀏覽(25)
  • Redis - 做緩存時高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(jù)庫緩存雙寫不一致

    Redis - 做緩存時高并發(fā)問題:緩存穿透、擊穿、雪崩,數(shù)據(jù)庫緩存雙寫不一致

    當用戶訪問的數(shù)據(jù)既不在緩存也不在數(shù)據(jù)庫中時,就會導致每個用戶查詢都會“穿透” 緩存“直抵”數(shù)據(jù)庫。這種情況就稱為緩存穿透。當高度發(fā)的訪問請求到達時,緩存穿透不 僅增加了響應時間,而且還會引發(fā)對 DBMS 的高并發(fā)查詢,這種高并發(fā)查詢很可能會導致 DBMS 的崩

    2024年02月04日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包