Redis緩存一致性問題(自用記錄)

背景

在開發過程中,redis緩存技術被大范圍應用。由于現在的系統大多是分布式的,高并發的,redis和傳統的數據庫,存在數據不一致的問題。

解決方案

本文主要探討兩者數據不一致的解決方案:

  1. 給緩存設置過期時間,保證數據的最終一致性
    我們可以對存入緩存的數據設置過期時間,所有的寫操作以數據庫為準,對緩存操作只是盡最大努力。
    也就是說如果數據庫寫成功,緩存更新失敗,那么只要到達過期時間,則后面的讀請求自然會從數據庫中讀取新值然后回填緩存。

  2. 通過合理的更新策略保證數據一致性

 - 先更新數據庫,再更新緩存-  先刪除緩存,再更新數據庫-  先刪除緩存,再更新數據庫

方案的可實施性

1.給緩存設置過期時間,保證數據的最終一致性。
這種方案雖然能保證數據的一致性,但是在一定時間范圍內數據存在不一致性

2 更新策略分析
2.1 先更新數據庫,再更新緩存。這種方案看似可行,實際并不可靠。原因如下:

同時有請求A和請求B進行更新操作,那么會出現

1)線程A更新了數據庫
2)線程B更新了數據庫
3)線程B更新了緩存
4)線程A更新了緩存

這就出現請求A更新緩存應該比請求B更新緩存早才對,但是因為網絡,運算等原因,B卻比A更早更新了緩存。這就導致了臟數據,因此不考慮。

2.2 先刪除緩存,再更新數據庫。這種方案也極易導致數據不一致。

如下操作

1)請求A進行寫操作,刪除緩存
2)請求B查詢發現緩存不存在
3)請求B去數據庫查詢得到舊值
4)請求B將舊值寫入緩存
5)請求A將新值寫入數據庫

上述情況就會導致不一致的情形出現。而且,如果不采用給緩存設置過期時間策略,該數據永遠都是臟數據。

如何解決解決這種問題,采用延時雙刪技術

1)先淘汰緩存
2)再寫數據庫(這兩步和原來一樣)
3)休眠1秒,再次淘汰緩存

有效的將1秒內所造成的緩存臟數據,再次刪除。

2.3 先更新數據庫,再刪除緩存。這種方案是可行性比較高的方案,但也不是絕對的可靠。
兩個線程同時進行寫操作:

1) 線程A更新數據庫
2)線程B更新數據庫
3)線程B刪除緩存
4)線程A刪除緩存

這種情況下不存在問題。但是也存在概率比較低可靠性問題:

1)緩存剛好失效
2)請求A查詢數據庫,得一個舊值
3)請求B將新值寫入數據庫
4)請求B刪除緩存
5)請求A將查到的舊值寫入緩存

這種情況下也會存在臟數據的問題。

為什么這種情況概率比較低?

  1. 這個條件需要發生在讀緩存時緩存失效,而且并發著有一個寫操作。
  2. 而實際上數據庫的寫操作會比讀操作慢得多,而且還要鎖表,而讀操作必需在寫操作前進入數據庫操作,而又要晚于寫操作更新緩存,所有的這些條件都具備的概率基本并不大。

那么如何解決?
可以采用延時雙刪除。

1)更新數據庫
2)刪除緩存
3)延時幾秒再次刪除緩存

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697587.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dell戴爾電腦靈越系列Inspiron 15 3520原廠Win11系統中文版/英文版

Dell戴爾筆記本靈越3520原裝出廠Windows11系統包,恢復出廠開箱預裝OEM系統 鏈接:https://pan.baidu.com/s/1mMOAnvXz5NCDO_KImHR5gQ?pwd3nvw 提取碼:3nvw 原廠系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、Office辦公軟件、MyD…

Jmeter接口測試 ,這應該是全網最詳細的教程了

🍅 視頻學習:文末有免費的配套視頻可觀看 🍅 關注公眾號【互聯網雜貨鋪】,回復 1 ,免費獲取軟件測試全套資料,資料在手,漲薪更快 一、Jmeter 的使用步驟 打開Jmeter 安裝包,進入\bi…

postman-使用Postman的模擬服務來模擬(mock)后端數據,完成前端模擬API調用

最近項目上比較忙,任務多時間緊,導致后端開發任務繁多,無法及時開發完畢,但是前端同學已經把對應功能開發完成,需要進行前后端聯調來驗證API及一些交互問題;這不能因為后端的進度來影響前端的工作完成情況&…

【Linux進程】馮·諾依曼體系結構以及操作系統的深入理解

📙 作者簡介 :RO-BERRY 📗 學習方向:致力于C、C、數據結構、TCP/IP、數據庫等等一系列知識 📒 日后方向 : 偏向于CPP開發以及大數據方向,歡迎各位關注,謝謝各位的支持 目錄 1.馮諾依曼體系結構特…

kafka和ZK的關系

zk相當于是kafka的一個基礎設施 Kafka是一種高吞吐量、可擴展的分布式發布訂閱消息系統,ZooKeeper是一個分布式協調服務,用于管理和協調分布式系統中的各種資源 Zookeeper:管理broker,consumer 創建broker后,向zk注冊…

適用于生物行業的樣本管理系統

在生物樣本管理系統的應用中,我們首先需要了解生物樣本的特點和要求。生物樣本具有多樣性和易變性,需要被妥善保存和跟蹤,以確保其質量和可用性。 因此,一個有效的生物樣本管理系統需要具備以下特點: 全面性&#xff1…

Spring Event的原理以及缺陷

原理:Spring 事件監聽機制及原理分析 - Admol - 博客園 (cnblogs.com) 使用bug:Spring Event 別瞎用!從我司的悲劇中,我總結了6 條最佳實踐!-騰訊云開發者社區-騰訊云 (tencent.com)

2024最新任推邦邀請碼是什么

任推邦是一款非常受歡迎的推廣APP,任推邦邀請碼是【222222】獲得現金獎勵和提成獎勵用戶可以通過邀請好友加入來獲取收益。2024最新的任推邦邀請碼是【222222】,小編已經給大家整理好了他趣許多的邀請碼,想要領取獎勵的小伙伴快來和小編一起了…

聚合函數()不要隨意加空格

報錯:1630 - FUNCTION link.SUM does not exist. Check the Function Name Parsing and Resolution section in the Reference Manual 解決方法:count、avg、sum等函數后緊隨的()之間不能加空格,去掉這個空格即可,因為count()、a…

js 監聽元素是否出現在可視區域--IntersectionObserver

觀察者模式監聽判斷dom元素是否在可視區域內 本項目是使用vue3的寫法。 1.IntersectionObserver IntersectionObserver可以用來自動監聽元素是否進入了設備的可視區域之內,而不需要頻繁的計算來做這個判斷。由于可見(visible)的本質是&…

融中穿刺路徑角度評估的C++技術實現

消融模型的三維渲染 我們以肝部為例,通常肝部在做消融手術規劃時有幾個步驟。 一三維重建: 對器官進行圖像分割; 對腫瘤的原發區域GTV進行勾畫。 二穿刺路徑的規劃: 路徑規劃當中有幾個約束:穿刺深度、危及器官的…

OpenAI推出首個AI視頻模型Sora:重塑視頻創作與體驗

鏈接:華為OD機考原題附代碼 Sora - 探索AI視頻模型的無限可能 隨著人工智能技術的飛速發展,AI視頻模型已成為科技領域的新熱點。而在這個浪潮中,OpenAI推出的首個AI視頻模型Sora,以其卓越的性能和前瞻性的技術,引領著…

SpringBoot快速整合Thymeleaf實現文件上傳案例

SpringBoot快速整合Thymeleaf實現文件上傳案例 文章目錄 SpringBoot快速整合Thymeleaf實現文件上傳案例1. 創建工程2. pom.xml文件2. application.yml 配置3. 前端fileupload.html4. 后端Controller 本案例環境: SpringBoot: 2.3.0.RELEASEJDK: 1.8前端模板: thymel…

【PHP進階】Redis批處理緩存

大家好,我是程序員若風,又到了技術分享時刻。 概要 在某些場景下,我們需要頻繁的使用到緩存,比如需要獲取多個key值,如果采用單個拿緩存的辦法,會造成網絡IO極大的浪費,所以我們需要用戶Redis…

Leetcode3036. 匹配模式數組的子數組數目 II

Every day a Leetcode 題目來源:3036. 匹配模式數組的子數組數目 II 解法1:KMP 設數組 nums 的長度為 m,數組 pattern 的長度為 n。 遍歷數組 nums 的每個長度是 n1 的子數組并計算子數組的模式,然后與數組 pattern 比較&…

JavaScript 設計模式之觀察者模式

觀察者模式 觀察者模式又被稱為發布-訂閱模式,使用一個對象來收集訂閱者,在發布時遍歷所有訂閱者,然后將信息傳遞給訂閱者,可以這樣來實現一個簡單的模式 const Observable (function () {let __messages {}return {register:…

win系統下安裝mysql5.7并配置環境變量、設置root用戶和服務啟動的詳細操作教程

本篇文章主要講解:win系統下安裝mysql5.7并配置環境變量、設置root用戶和服務啟動的詳細操作教程 日期:2024年2月22日 作者:任聰聰 一、mysql5.7版本的下載 官方下載地址:https://downloads.mysql.com/archives/community/ 步驟…

服務器生信環境配置腳本

服務器生信環境配置腳本的重要性在于它為生物信息學的數據分析提供了一個統一和標準化的計算環境。通過自動化的配置腳本,可以快速地在服務器上部署和設置生物信息學的軟件和依賴庫,確保分析的可重復性和準確性。這樣,生物信息學家和研究人員…

【鴻蒙 HarmonyOS 4.0】狀態管理

一、介紹 資料來自官網:文檔中心 在聲明式UI編程框架中,UI是程序狀態的運行結果,用戶構建了一個UI模型,其中應用的運行時的狀態是參數。當參數改變時,UI作為返回結果,也將進行對應的改變。這些運行時的狀…

Stable Diffusion 模型的概念、類型、下載、安裝、使用

本文收錄于《AI繪畫從入門到精通》專欄,專欄總目錄:點這里。 大家好,我是水滴~~ 我們在《Stable Diffusion WebUI 界面介紹》 時,第一個就講到了 Stable Diffusion 模型,那么這個模型是什么?該從哪兒下載&…