緩存一致性解決方法

對于緩存 + 數據庫讀寫,有個經典的Cache Aside Pattern:
讀取:先讀取緩存,緩存里沒有,讀取數據庫,然后返回響應,順便保存緩存:
在這里插入圖片描述
更新:先更新數據庫,然后刪除緩存
在這里插入圖片描述

為什么是刪除緩存而不是更新緩存?

  • 并發情況下更新緩存可能會帶來更多問題,直接刪除緩存更加穩妥
  • 緩存更新消耗更多資源,直接刪除,用時再從數據庫讀取,寫進緩存,更省性能

先更新數據庫,然后刪除緩存

一致性問題

假設更新數據庫成功,接下來還沒來得及刪除緩存,或者刪除緩存失敗,此時其他線程進來讀的就是臟數據。
在這里插入圖片描述
既然刪除緩存失敗會導致臟數據,那么就得想辦法能讓它刪除成功。一般來說有兩種方法:消息隊列重試機制監聽binlog異步刪除
消息隊列重試機制
如果刪除緩存失敗,向消息隊列發送消息,把刪除失敗的key放進去,消費消息隊列,獲取要刪除的key,然后重試刪除。
在這里插入圖片描述

這樣做的話引入了消息隊列,對現有的業務造成了入侵,復雜度升高

監聽binlog異步刪除
用一個服務去監聽數據庫的binlog,獲取需要操作的數據。然后用另外一個服務獲取訂閱程序傳來的信息,進行緩存刪除操作。這樣對于業務的入侵就小了。
在這里插入圖片描述

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

在并發情況下,先刪除緩存,再更新數據庫,此時數據庫還未更新成功,這時有其他線程進來,讀取緩存,緩存不存在,讀取數據庫,讀取的是就是舊值,此時緩存不一致就發生了
解決方案便是延時雙刪
就是在刪除緩存,更新數據庫之后,休眠一段時間后,再次刪除緩存。延時刪除之后,就把緩存里面緩存的舊值刪除了。
再有請求進來,就是讀取數據庫里的新值,再把新值保存進緩存。如果第二次刪除也失敗,那么就再次重試。

圖1 緩存不一致
圖2 延時雙刪

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

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

相關文章

使用SpringMVC的表單驗證

上一篇搭建了基本項目,這一篇在此基礎上加入表單驗證功能。 第一步,添加command類 Java代碼 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

hdu1247(Hat’s Words)

我以為像a、aa這樣的輸入應該是沒有輸出的,結果還是要輸出aa。 建樹的時候就是常規建樹,不過查找的時候要做一些變形:對于一個單詞,從第一位檢查有沒有單詞是它的前綴,如果有的話,再去檢查它的后半部分是不…

單體、分布式、微服務、Serverless軟件架構一覽

目錄軟件架構單體架構分布式應用微服務架構Serverless架構總結Reference軟件架構 軟件架構就是軟件的基本結構,合適的架構是軟件成功的最重要因素之一。這里列舉了目前流行的4種軟件架構。 單體架構 典型的三級架構:前端(web/手機端&#…

MyBatis3 association error - The content of element type resultMap must match (constructor?,id*,r...

MyBatis3 association error - The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)" 1.后臺錯誤信息-問題現象: ERROR [geby:Context initialization failed] 2013-0…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神圖?

Midjourney在沉寂九個月后推出了Midjourney V6,這個文生圖產品體現出的更細膩的細節處理,更強大的語言理解能力和更加“不像AI”的圖片效果在過去幾天引發一片驚呼。 作為一個閉源的模型產品,Midjourney的魔法配方并不為人所知,但…

HTTP 錯誤500.19 -Internal Server Error

HTTP 錯誤500.19 -Internal Server Error 原文:HTTP 錯誤500.19 -Internal Server Error HTTP 錯誤500.19 -Internal Server Error 錯誤代碼 0x80070021 asp.net 2009-11-05 16:54:33 閱讀484 評論1 字號:大中小 錯誤摘要 HTTP 錯誤500.19 -Internal Server Error …

連續內存分區式內存管理

目錄前言分區式內存管理動態分區內存管理總結本筆記參考黃工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA 前言 內存管理模塊主要負責內存的初始化、分配以及釋放。 從分配內存是否連續可以分為兩大類: 1、連續內存管理 為進程分配的內存空間是連續的&a…

用DEVC++作圖

小海豚學NOIP,老師說要用DEV C。 小海豚喜歡畫圖,記得以前用C#編些程序給她看。可前一陣打開看,我的免費Visual Studio過期了。可惡的Microsoft ,不想用盜版難道就要每個月就下載一次? 于是就用DEV C的Windows調用吧。…

Python服務器開發三:Socket

Python服務器開發三:Socket socket是操作系統中I/O的延續,它可以使進程和機器之間的通信成為可能。socket可以看成一個標準的文件描述符。不同的是文件需要用open()函數打開,而socket用socket() 函數建立.recv()、send()函數和read()、write(…

Syntax error: Bad for loop variable解決辦法

在Ubuntu下寫的shell文件t.sh執行時出現錯誤: 1 t.sh: 6: Syntax error: Bad for loop variable 從ubuntu 6.10開始,ubuntu就將之前默認的bash shell更換成了dash shell,其表現為/bin/sh鏈接倒了/bin/dash,而不是傳統的/bin/bash&…

Linux命令常見

摘自: 常考的 21 條 Linux 命令 目錄)cd,切換路徑ls,查看文件與目錄的命令cp,用于復制文件mv,用于移動文件、目錄cat,查看文件內容find,文件搜索文件權限命令, 設置權限,-取消權限文本處理命令打包和壓縮文件命令進程相…

記一次調試

這是我最近幾個月來遇到的最棘手的一個問題:* 昨天花了4個小時找出第一層次的原因這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是一個gradle的plugin,用來resolve公司內部的dependency的,…

OSGi.NET 學習筆記 [模塊化和插件化][小結]

【目錄】-【模塊化和插件化】-【小結】 現在我們來對OSGi.NET的“模塊化和插件化”做一個小結,再次把官方的說明拿出來  1) 物理隔離:基于UIOSP開發的模塊是一個物理隔離的可單獨部署的模塊,每一個模塊擁有獨立的文件夾、類型空…

miniob :相關環境配置

How to build 參考視頻:https://www.bilibili.com/video/BV1gv411A7oA?spm_id_from333.999.0.0將代碼下載并且安裝編譯。 git clone失敗的話參考:https://blog.csdn.net/sxg0205/article/details/81412921 install cmakebuild libevent git submodul…

Fedora 20 配置

前幾天裝了fedora 20, 斷斷續續的進行了以下配置: 1. 安裝oracle java及jdk版本切換 安裝的過程很簡單,從oracle官網上下載jdk及jre的rpm包,使用rpm -ivh 安裝。但是遇到一個問題,因為fedora系統自帶了openJDK,如果安裝oracle的jd…

raft算法學習(一):角色概念以及選舉過程

Raft算法是強領導模型,集群中只能有一個領導。 下面是raft的視頻講解: raft raft的三種角色及其概念 服務器節點狀態一共有三種:領導者(Leader)、跟隨著(Follower)、候選人(Candid…

解決 FLex 4.0 Module里面Alert.show();出錯問題

TypeError: Error #1009: 無法訪問空對象引用的屬性或方法。 at mx.managers::PopUpManagerImpl/http://www.adobe.com/2006/flex/mx/internal::createModalWindow()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:701] at mx.manag…

datetime2 數據類型

.net的Entity Framework構建網站數據層,給一個實體的DATETIME類型的屬性賦值時 突然莫名奇妙顯示有一個類型不匹配的異常如下: System.Data.SqlClient.SqlException: 從 datetime2 數據類型到 datetime 數據類型的轉換產生一個超出范圍的值。 解決方法&a…

Yslow的A評級指南

這里測的是V2引擎,V1想拿A幾乎不可能,一個CDN測試的F就可以輕松廢了你的網站。 A評級 現在一個一個分析。 User fewer HTTP Requests:減少HTTP請求 圖片、CSS、JS、flash等這些都需要增加http請求數,減少這些元素的數量能減少響應…

jquery下 選擇器整理

jQuery 的選擇器可謂之強大無比,這里簡單地總結一下常用的元素查找方法 $("#myELement") 選擇id值等于myElement的元素,id值不能重復在文檔中只能有一個id值是myElement所以得到的是唯一的元素 $("div") 選擇所有的di…