国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 數(shù)據(jù)庫 Redis 一起分析Redis緩存一致性、緩存穿透、緩存擊穿及緩存雪崩問題

一起分析Redis緩存一致性、緩存穿透、緩存擊穿及緩存雪崩問題

May 19, 2022 am 10:12 AM
redis

本篇文章給大家?guī)砹岁P(guān)于Redis的相關(guān)知識,其中主要介紹了關(guān)于緩存一致性、緩存穿透、緩存擊穿、緩存雪崩以及緩存數(shù)據(jù)的寫同步的與DB一致性的問題,下面一起來看一下,希望對大家有幫助。

一起分析Redis緩存一致性、緩存穿透、緩存擊穿及緩存雪崩問題

相關(guān)推薦:《分析Redis中熱點key存儲問題,聊聊緩存異常的解決方法

(1)緩存失效一致性問題

一般緩存的使用方式是:先讀取緩存,若不存在則從DB中讀取,并將結(jié)果寫入到緩存中;下次數(shù)據(jù)讀取時便可以直接從緩存中獲取數(shù)據(jù)?!鞠嚓P(guān)推薦:Redis視頻教程

數(shù)據(jù)的修改是直接失效緩存數(shù)據(jù),再修改DB內(nèi)容,避免DB修改成功,但由于網(wǎng)絡(luò)或者其他問題導(dǎo)致緩存數(shù)據(jù)沒有清理,造成了臟數(shù)據(jù)。但這樣仍然無法避免臟數(shù)據(jù)的產(chǎn)生,一種并發(fā)的場景下:假設(shè)業(yè)務(wù)對數(shù)據(jù)Key:Hello Value:World有大量的讀取和修改請求。線程A向OCS讀取Key:Hello,得到Not Found結(jié)果,開始向DB請求數(shù)據(jù),得到數(shù)據(jù)Key:Hello Value:World;接下來準(zhǔn)備向OCS寫入此條數(shù)據(jù),但在寫入OCS前(網(wǎng)絡(luò),CPU都等可能導(dǎo)致A線程處理速度降低)另一B線程請求修改數(shù)據(jù)Key:Hello Value:OCS,首先執(zhí)行失效緩存動作(因為B線程并不知道是否有此條數(shù)據(jù),因此直接執(zhí)行失效操作),OCS成功處理了失效請求。轉(zhuǎn)回到A線程繼續(xù)執(zhí)行寫入OCS,將Key:Hello Value:World寫入到緩存中,A線程任務(wù)結(jié)束;B線程也成功修改了DB數(shù)據(jù)內(nèi)容為Key:Hello Value:OCS。為了解決這個問題,OCS擴充了Memcached協(xié)議(公有云即將支持),增加了deleteAndIncVersion接口。此接口并不會真的刪除數(shù)據(jù),而是給數(shù)據(jù)打了標(biāo)簽,表明已失效狀態(tài),并且增加數(shù)據(jù)版本號;如果數(shù)據(jù)不存在則寫入NULL,同時也生成隨機數(shù)據(jù)版本號。OCS寫入支持原子對比版本號:假設(shè)傳入的版本號與OCS保存的數(shù)據(jù)版本號一致或者原數(shù)據(jù)不存在,則準(zhǔn)許寫入,否則拒絕修改。

回到剛才的場景上:線程A向OCS讀取Key:Hello,得到Not Found結(jié)果,開始向DB請求數(shù)據(jù),得到數(shù)據(jù)Key:Hello Value:World;接下來準(zhǔn)備向OCS寫入此條數(shù)據(jù),版本號信息默認(rèn)為1;在A寫入OCS前另一個B線程發(fā)起了動作修改數(shù)據(jù)Key:Hello Value:OCS,首先執(zhí)行刪除緩存動作,OCS順利處理了deleteAndIncVersion請求,生成了隨機版本號12345(約定大于1000)。轉(zhuǎn)回到A線程繼續(xù)執(zhí)行寫入OCS,請求將Key:Hello Value:World寫入,此時緩存系統(tǒng)發(fā)現(xiàn)傳入的版本號信息不匹配(1 ?。?12345),寫入失敗,A線程任務(wù)結(jié)束;B線程也成功修改了DB數(shù)據(jù)內(nèi)容為Key:Hello Value:OCS。

此時OCS中的數(shù)據(jù)為Key:Hello Value:NULL Version:12345;DB中的數(shù)據(jù)為Key:Hello Value:OCS,后續(xù)讀任務(wù)時會再次嘗試將DB中的數(shù)據(jù)寫入到OCS中。

(2)緩存數(shù)據(jù)的寫同步的與DB一致性問題

隨著網(wǎng)站規(guī)模增長和可靠性的提升,會面臨多IDC的部署,每個IDC都有一套獨立的DB和緩存系統(tǒng),這時緩存一致性又成了突出的問題。

首先緩存系統(tǒng)為了保證高效率,會杜絕磁盤IO,哪怕是寫B(tài)INLOG;當(dāng)然緩存系統(tǒng)為了性能可以只同步刪除,不同步寫入,那么緩存的同步一般會優(yōu)先于DB同步到達(畢竟緩存系統(tǒng)的效率要高得多),那么就會出現(xiàn)緩存中無數(shù)據(jù),DB中是舊數(shù)據(jù)的場景。此時,有業(yè)務(wù)請求數(shù)據(jù),讀取緩存Not Found,從DB讀取并加載到緩存中的仍然是舊數(shù)據(jù),DB數(shù)據(jù)同步到達時也只更新了DB,緩存臟數(shù)據(jù)無法被清除。

01.png

從上面的情況可以看出,不一致的根本原因是異構(gòu)系統(tǒng)之間無法協(xié)同同步,不能保證DB數(shù)據(jù)先同步,緩存數(shù)據(jù)后同步。所以就要考慮緩存系統(tǒng)如何等待DB同步,或者能否做到兩者共用一套同步機制?緩存同步也依賴DB BINLOG是一個可行的方案。

IDC1中的DB,通過BINLOG同步給IDC2中的DB,此事IDC2-DB數(shù)據(jù)修改也會產(chǎn)生自身的BINLOG,緩存的數(shù)據(jù)同步就可以通過IDC2-DB BINLOG進行。緩存同步模塊分析BINLOG后,失效相應(yīng)的緩存Key,同步從并行改為串行,保證了先后順序。

(3)緩存穿透(DB承受了沒有必要的查詢流量)

方法一:是布隆過濾器。它是一種空間效率極高的概率型算法和數(shù)據(jù)結(jié)構(gòu),用于判斷一個元素是否在集合中(類似Hashset)。它的核心是一個很長的二進制向量和一系列的hash函數(shù)。使用谷歌的guava實現(xiàn)布隆過濾器。1)存在誤算率,隨著存入的元素數(shù)量增加,誤算率也隨著增加2)一般情況下不能從布隆過濾器刪除元素3)數(shù)組長度以及hash函數(shù)個數(shù)確定過程復(fù)雜,布隆過濾器的使用場景?1)垃圾郵件地址過濾(地址數(shù)量很龐大)2)爬蟲URL地址去重3)解決緩存擊穿問題

方法二:存儲空結(jié)果,并設(shè)置空結(jié)果的時間

(4)緩存雪崩(緩存設(shè)置同一過期時間,引起的DB洪峰)

方法一:大多數(shù)系統(tǒng)設(shè)計者考慮用加鎖或者隊列的方式保證緩存的單線 程(進程)寫,從而避免失效時大量的并發(fā)請求落到底層存儲系統(tǒng)上

方法二:失效時間隨機值

(5)緩存擊穿(熱點Key,大量并發(fā)讀請求引起的小雪崩)

? ? 緩存在某個時間點過期的時候,恰好在這個時間點對這個Key有大量的并發(fā)請求過來,這些請求發(fā)現(xiàn)緩存過期一般都會從后端DB加載數(shù)據(jù)并回設(shè)到緩存,這個時候大并發(fā)的請求可能會瞬間把后端DB壓垮

方法一:1.使用分布是緩存支持的互斥鎖(mutex key),去set一個mutex key,當(dāng)操作返回成功時,再進行l(wèi)oad db的操作并回設(shè)緩存,也就是load DB 只會一個線程處理。

方法二:提前"使用互斥鎖(mutex key):在value內(nèi)部設(shè)置1個超時值(timeout1), timeout1比實際的memcache timeout(timeout2)小。當(dāng)從cache讀取到timeout1發(fā)現(xiàn)它已經(jīng)過期時候,馬上延長timeout1并重新設(shè)置到cache。然后再從數(shù)據(jù)庫加載數(shù)據(jù)并設(shè)置到cache中。增加了業(yè)務(wù)代碼的侵入過多,以及增加了編碼復(fù)雜性

方法三: "永遠(yuǎn)不過期": 從redis上看,確實沒有設(shè)置過期時間,這就保證了,不會出現(xiàn)熱點key過期問題,也就是“物理”不過期。從功能上看,如果不過期,那不就成靜態(tài)的了嗎?所以我們把過期時間存在key對應(yīng)的value里,如果發(fā)現(xiàn)要過期了,通過一個后臺的異步線程進行緩存的構(gòu)建,也就是“邏輯”過期

(6)緩存系統(tǒng)常見的緩存滿了和數(shù)據(jù)丟失問題

需要根據(jù)具體業(yè)務(wù)分析,通常我們采用LRU策略處理溢出,Redis的RDB和AOF持久化策略來保證一定情況下的數(shù)據(jù)安全。

更多編程相關(guān)知識,請訪問:編程視頻??!

以上是一起分析Redis緩存一致性、緩存穿透、緩存擊穿及緩存雪崩問題的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

laravel8 的優(yōu)化點 laravel8 的優(yōu)化點 Apr 18, 2025 pm 12:24 PM

Laravel 8 針對性能優(yōu)化提供了以下選項:緩存配置:使用 Redis 緩存驅(qū)動、緩存門面、緩存視圖和頁面片段。數(shù)據(jù)庫優(yōu)化:建立索引、使用查詢范圍、使用 Eloquent 關(guān)系。JavaScript 和 CSS 優(yōu)化:使用版本控制、合并和縮小資產(chǎn)、使用 CDN。代碼優(yōu)化:使用 Composer 安裝包、使用 Laravel 助手函數(shù)、遵循 PSR 標(biāo)準(zhǔn)。監(jiān)控和分析:使用 Laravel Scout、使用 Telescope、監(jiān)控應(yīng)用程序指標(biāo)。

如何利用Redis緩存方案高效實現(xiàn)產(chǎn)品排行榜列表的需求? 如何利用Redis緩存方案高效實現(xiàn)產(chǎn)品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現(xiàn)產(chǎn)品排行榜列表的需求?在開發(fā)過程中,我們常常需要處理排行榜的需求,例如展示一個?...

Spring Boot中OAuth2Authorization對象Redis緩存失敗怎么辦? Spring Boot中OAuth2Authorization對象Redis緩存失敗怎么辦? Apr 19, 2025 pm 08:03 PM

SpringBoot中使用Redis緩存OAuth2Authorization對象在SpringBoot應(yīng)用中,使用SpringSecurityOAuth2AuthorizationServer...

Laravel 最佳擴展包推薦:2024 年必備工具 Laravel 最佳擴展包推薦:2024 年必備工具 Apr 30, 2025 pm 02:18 PM

2024年必備的Laravel擴展包包括:1.LaravelDebugbar,用于監(jiān)控和調(diào)試代碼;2.LaravelTelescope,提供詳細(xì)的應(yīng)用監(jiān)控;3.LaravelHorizon,管理Redis隊列任務(wù)。這些擴展包能提升開發(fā)效率和應(yīng)用性能。

Laravel 環(huán)境搭建與基礎(chǔ)配置(Windows/Mac/Linux) Laravel 環(huán)境搭建與基礎(chǔ)配置(Windows/Mac/Linux) Apr 30, 2025 pm 02:27 PM

在不同操作系統(tǒng)上搭建Laravel環(huán)境的步驟如下:1.Windows:使用XAMPP安裝PHP和Composer,配置環(huán)境變量,安裝Laravel。2.Mac:使用Homebrew安裝PHP和Composer,安裝Laravel。3.Linux:使用Ubuntu更新系統(tǒng),安裝PHP和Composer,安裝Laravel。每個系統(tǒng)的具體命令和路徑有所不同,但核心步驟一致,確保順利搭建Laravel開發(fā)環(huán)境。

REDIS的角色:探索數(shù)據(jù)存儲和管理功能 REDIS的角色:探索數(shù)據(jù)存儲和管理功能 Apr 22, 2025 am 12:10 AM

Redis在數(shù)據(jù)存儲和管理中扮演著關(guān)鍵角色,通過其多種數(shù)據(jù)結(jié)構(gòu)和持久化機制成為現(xiàn)代應(yīng)用的核心。1)Redis支持字符串、列表、集合、有序集合和哈希表等數(shù)據(jù)結(jié)構(gòu),適用于緩存和復(fù)雜業(yè)務(wù)邏輯。2)通過RDB和AOF兩種持久化方式,Redis確保數(shù)據(jù)的可靠存儲和快速恢復(fù)。

在多節(jié)點環(huán)境下,如何確保Spring Boot的@Scheduled定時任務(wù)只在一個節(jié)點上執(zhí)行? 在多節(jié)點環(huán)境下,如何確保Spring Boot的@Scheduled定時任務(wù)只在一個節(jié)點上執(zhí)行? Apr 19, 2025 pm 10:57 PM

SpringBoot定時任務(wù)在多節(jié)點環(huán)境下的優(yōu)化方案在開發(fā)Spring...

See all articles