搜尋
首頁資料庫Redis一起分析Redis快取一致性、快取穿透、快取擊穿及快取雪崩問題

這篇文章為大家帶來了關於Redis的相關知識,其中主要介紹了關於快取一致性、快取穿透、快取擊穿、快取雪崩以及快取資料的寫同步的與DB一致性的問題,下面一起來看一下,希望對大家有幫助。

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

相關推薦:《分析Redis中熱點key儲存問題,聊聊快取異常的解決方法

(1)快取失效一致性問題

一般快取的使用方式是:先讀取緩存,若不存在則從DB中讀取,並將結果寫入到快取中;下次資料讀取時便可以直接從快取中取得資料。 【相關推薦:Redis影片教學

資料的修改是直接失效快取數據,再修改DB內容,避免DB修改成功,但由於網路或其他問題導致快取資料沒有清理,造成了髒數據。但這仍然無法避免髒資料的產生,一種並發的場景下:假設業務對資料Key:Hello Value:World有大量的讀取和修改請求。線程A向OCS讀取Key:Hello,得到Not Found結果,開始向DB請求數據,得到數據Key:Hello Value:World;接下來準備向OCS寫入此條數據,但在寫入OCS前(網絡, CPU都等可能導致A線程處理速度降低)另一B線程請求修改數據Key:Hello Value:OCS,首先執行失效緩存動作(因為B線程並不知道是否有此條數據,因此直接執行失效操作), OCS成功處理了失效請求。轉回A執行緒繼續執行寫入OCS,將Key:Hello Value:World寫入到快取中,A執行緒任務結束;B執行緒也成功修改了DB資料內容為Key:Hello Value:OCS。為了解決這個問題,OCS擴充了Memcached協定(公有雲即將支援),增加了deleteAndIncVersion介面。此介面並不會真的刪除數據,而是給數據打了標籤,表示已失效狀態,並且增加數據版本號;如果數據不存在則寫入NULL,同時也產生隨機數據版本號。 OCS寫入支援原子對比版本號:假設傳入的版本號與OCS保存的資料版本號一致或原始資料不存在,則準許寫入,否則拒絕修改。

回到剛才的場景:線程A向OCS讀取Key:Hello,得到Not Found結果,開始向DB請求數據,得到數據Key:Hello Value:World;接下來準備向OCS寫入此條數據,版本號資訊預設為1;在A寫入OCS前另一個B線程發起了動作修改數據Key:Hello Value:OCS,首先執行刪除緩存動作,OCS順利處理了deleteAndIncVersion請求,生成了隨機版本號12345(約定大於1000)。轉回A執行緒繼續執行寫入OCS,請求將Key:Hello Value:World寫入,此時快取系統發現傳入的版本號資訊不符(1 != 12345),寫入失敗,A執行緒任務結束;B執行緒也成功修改了DB資料內容為Key:Hello Value:OCS。

此時OCS中的資料為Key:Hello Value:NULL Version:12345;DB中的資料為Key:Hello Value:OCS,後續讀取任務時會再次嘗試將DB中的資料寫入到OCS中。

(2)快取資料的寫入同步的與DB一致性問題

隨著網站規模成長和可靠性的提升,會面臨多IDC的部署,每個IDC都有一套獨立的DB和快取系統,這時快取一致性又成了突顯的問題。

首先快取系統為了確保高效率,會杜絕磁碟IO,即使是寫BINLOG;當然快取系統為了效能可以只同步刪除,不同步寫入,那麼快取的同步一般會優先於DB同步到達(畢竟快取系統的效率要高得多),那麼就會出現快取中無數據,DB中是舊數據的場景。此時,有業務請求數據,讀取快取Not Found,從DB讀取並加載到快取中的仍然是舊數據,DB數據同步到達時也只更新了DB,快取髒數據無法被清除。

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

從上面的情況可以看出,不一致的根本原因是異質系統之間無法協同同步,無法保證DB資料先同步,快取資料後同步。所以就要考慮快取系統如何等待DB同步,或是能否做到兩者共用一套同步機制?快取同步也依賴DB BINLOG是一個可行的方案。

IDC1中的DB,透過BINLOG同步給IDC2中的DB,此事IDC2-DB資料修改也會產生自身的BINLOG,快取的資料同步就可以透過IDC2-DB BINLOG進行。快取同步模組分析BINLOG後,失效對應的快取Key,同步從並行改為串行,確保了先後順序。

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

方法一:是布隆過濾器。它是一種空間效率極高的機率型演算法和資料結構,用來判斷一個元素是否在集合中(類似Hashset)。它的核心是一個很長的二進位向量和一系列的hash函數。使用Google的guava實作布隆過濾器。 1)存在誤算率,隨著存入的元素數量增加,誤算率也隨著增加2)一般情況下不能從布隆過濾器刪除元素3)數組長度以及hash函數個數確定過程複雜,布隆過濾器的使用場景? 1)垃圾郵件位址過濾(位址數量很龐大)2)爬蟲URL位址去重3)解決快取擊穿問題

方法二:儲存空結果,並設定空結果的時間

(4)快取雪崩(快取設定同一過期時間,造成的DB洪峰)

#方法一:大多數系統設計者考慮用加鎖或佇列的方式保證快取的單執行緒(進程)寫,從而避免失效時大量的並發請求落在底層儲存系統上

方法二:失效時間隨機值

(5)快取擊穿(熱點Key,大量並發讀取請求引起的小雪崩)

    快取在某個時間點過期的時候,恰好在這個時間點對這個Key有大量的並發請求過來,這些請求發現快取過期一般都會從後端DB載入資料並回設到緩存,這個時候大並發的請求可能會瞬間把後端DB壓垮

方法一:1.使用分散是緩存支援的互斥鎖(mutex key),去set一個mutex key,當操作返回成功時,再進行load db的操作並回設緩存,也就是load DB 只會一個線程處理。

方法二:提前"使用互斥鎖(mutex key):在value內部設定1個超時值(timeout1), timeout1比實際的memcache timeout(timeout2)小。當從cache讀取到timeout1發現它已經過期時候,馬上延長timeout1並重新設定到cache。然後再從資料庫載入資料並設定到cache。增加了業務程式碼的侵入過多,以及增加了編碼複雜性

方法三: 「永不過期」: 從redis上看,確實沒有設定過期時間,這就保證了,不會出現熱點key過期問題,也就是「物理」不過期。從功能上看,如果不過期,那不就成靜態的了嗎?所以我們把過期時間存在key對應的value裡,如果發現要過期了,通過一個後台的異步線程進行緩存的構建,也就是“邏輯”過期

(6)快取系統常見的快取滿了和資料遺失問題

需要根據特定業務分析,通常我們採用LRU策略處理溢出,Redis的RDB和AOF持久化策略來保證一定情況下的資料安全。

更多程式相關知識,請造訪:程式設計影片!!

以上是一起分析Redis快取一致性、快取穿透、快取擊穿及快取雪崩問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:简书。如有侵權,請聯絡admin@php.cn刪除
es和redis区别es和redis区别Jul 06, 2019 pm 01:45 PM

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

一起来聊聊Redis有什么优势和特点一起来聊聊Redis有什么优势和特点May 16, 2022 pm 06:04 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

实例详解Redis Cluster集群收缩主从节点实例详解Redis Cluster集群收缩主从节点Apr 21, 2022 pm 06:23 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

Redis实现排行榜及相同积分按时间排序功能的实现Redis实现排行榜及相同积分按时间排序功能的实现Aug 22, 2022 pm 05:51 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

详细解析Redis中命令的原子性详细解析Redis中命令的原子性Jun 01, 2022 am 11:58 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

实例详解Redis实现排行榜及相同积分按时间排序功能的实现实例详解Redis实现排行榜及相同积分按时间排序功能的实现Aug 26, 2022 pm 02:09 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

一文搞懂redis的bitmap一文搞懂redis的bitmapApr 27, 2022 pm 07:48 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

redis error什么意思redis error什么意思Jun 17, 2019 am 11:07 AM

redis error就是redis数据库和其组合使用的部件出现错误,这个出现的错误有很多种,例如Redis被配置为保存数据库快照,但它不能持久化到硬盘,用来修改集合数据的命令不能用。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。