生產實踐:Redis與Mysql的數據強一致性方案

公眾號「架構成長指南」,專注于生產實踐、云原生、分布式系統、大數據技術分享。

數據庫和Redis如何保存強一致性,這篇文章告訴你

目的

Redis和Msql來保持數據同步,并且強一致,以此來提高對應接口的響應速度,剛開始考慮是用mybatis的二級緩存,發現坑不少,于是決定自己搞

要關注的問題點

操作數據必須是唯一索引

如果更新數據不是唯一索引,則數據庫更新后的值,與緩存不一致,而查詢還會走緩存,而查詢的值是臟值。

查詢唯一數據,數據值必須是全部字段

假如:B交易查詢字段不是全部字段,進行查詢放入緩存,A交易進行查詢時,從緩存獲取,由于A交易需要全部字段,所以就會出現不可預知的問題。

查詢緩存數據后,必須要在程序中再次進行條件判斷

因為在redis中,存儲的的key是唯一索引,所以當查詢數據后,只會命中唯一索引的數據,其他附帶查詢條件不生效。

例如:唯一索引為:user_id ,那么執行
select * from t_user_auth_info where user_id=‘111’ and user_level=‘1’是,條件user_level是不會生效

高并發場景下要注意臟數據的控制

假設是以上流程圖,在更新操作,第一步刪除緩存后,線程切換到查詢線程,查詢操作判斷緩存中沒有數據,就會查詢數據庫,并把數據存入到緩存中,這時線程在切換到更新線程,進行數據庫的更新,這會就會造成,數據庫的數據與緩存有不一致性。

最終方案

基于以上問題,我們的最終流程圖如下

以上流程圖在進行更新操作時,增加刪除緩存lock,如果這會查詢操作判斷緩存中有數據,就直接返回數據,如果沒有再次判斷有沒有存在刪除緩存lock,如果有則走數據庫查詢,并返回,不放入緩存,如果沒有則查詢數據庫,并放入緩存,并返回。

注意: 登記緩存標識時,增加緩存lock失效時間,因為有可能刪除緩存和數據庫更新成功了,而刪除緩存lock失敗了,那這樣后續查詢就都走數據庫了,這個方案就失去意義了。

代碼實現方案

通過aop對db的操作方法,進行攔截,查詢方法采用一個切面,刪除和更新方法采用一個切面,然后再按照以上流程進行編寫,我們這邊是使用框架進行封裝,最后只需要開發人員配置以下xml即可

<cache-config><cache-entity po="com.demo.po.AuthUser" key-prefix="SYSTEM_Person" po-throws="true" key-expire="" key-expire-time-unit=""><key-properties>userId</key-properties>		</cache-entity>
</cache-config>

如果需要具體實現方案,請聯系作者

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

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

相關文章

探索移動端可能性:Capacitor5.5.1和vue2在Android studio中精細融合

介紹&#xff1a; 移動應用開發是日益復雜的任務&#xff0c;本文將帶領您深入探索如何無縫集成Capacitor5.5.1、Vue2和Android Studio&#xff0c;以加速您的開發流程Capacitor 是一個用于構建跨平臺移動應用程序的開源框架。Vue 是一個流行的 JavaScript 框架&#xff0c;用…

多線程Thread(初階三:線程的狀態及線程安全)

目錄 一、線程的狀態 二、線程安全 一、線程的狀態 1.NEW Thread&#xff1a;對象創建好了&#xff0c;但是還沒有調用 start 方法在系統中創建線程。 2.TERMINATED&#xff1a; Thread 對象仍然存在,但是系統內部的線程已經執行完畢了。 3.RUNNABLE&#xff1a; 就緒狀態&…

雪花算法原理(設計原理、優缺點、如何改造它、以及應用)

雪花算法原理&#xff08;設計原理、優缺點、如何改造它、以及應用&#xff09; 雪花算法源碼為什么雪花算法是 64 位&#xff1f;為什么時間戳是41位&#xff1f;占雪花算法的 43-47 bit 位為什么工作臺最大只支持設置 31 &#xff1f;工作臺設置成了 63 會導致什么后果&#…

JeecgBoot3.0 漏洞升級 — 快速文檔

近幾年來&#xff0c;黑客攻擊行為呈現出日益復雜和隱蔽的趨勢&#xff0c;對個人和組織的安全造成了嚴重威脅。黑客們不斷尋找新的漏洞和安全漏洞&#xff0c;利用各種手段進行網絡攻擊&#xff0c;包括惡意軟件、網絡釣魚、勒索軟件等。因此&#xff0c;我們每個人都需要關注…

Java 之 final 詳解

目錄 一. 前言 二. final 的基礎使用 2.1. 修飾類 2.2. 修飾方法 2.2.1. private 方法是隱式的 final 2.2.2. final 方法可以被重載 2.3. 修飾參數 2.4. 修飾變量 2.4.1. static final 2.4.2. blank final 2.4.3. 所有 final 修飾的字段都是編譯期常量嗎&#xff1f…

數據結構:二叉查找樹,平衡二叉樹AVLTree,紅黑樹RBTree,平衡多路查找數B-Tree,B+Tree

二叉查找樹 二叉樹具有以下性質&#xff1a;左子樹的鍵值小于根的鍵值&#xff0c;右子樹的鍵值大于根的鍵值。 對該二叉樹的節點進行查找發現深度為1的節點的查找次數為1&#xff0c;深度為2的查找次數為2&#xff0c;深度為n的節點的查找次數為n&#xff0c;因此其平均查找次…

2023年亞太數學建模C題數據分享+詳細思路

在報名截止的前一天&#xff0c;我嘗試進行了報名。到那時&#xff0c;已有11,000個隊伍注冊參賽。在我的了解中&#xff0c;在數模比賽中除了國賽美賽外&#xff0c;幾乎沒有其他競賽的參賽隊伍數量能與此相媲美。即便不考慮賽題的難度和認可度&#xff0c;亞太地區的這場競賽…

JavaScript實現動態背景顏色

JavaScript實現動態背景顏色 前言實現過程HTML實現過程CSS實現過程JS實現過程全部源碼 前言 本文主要講解JavaScript如何實現動態背景顏色&#xff0c;可以根據顏色選擇器選擇的顏色而實時更新到背景中&#xff0c;如下圖所示。 當我們在顏色選擇器中改變顏色時&#xff0c;會…

代碼掃描,漏洞檢測

1) SQL注入是一種數據庫攻擊手段。攻擊者通過向應用程序提交惡意代碼來改變原SQL語句的含義&#xff0c;進而執行任意SQL命令&#xff0c;達到入侵數據庫乃至操作系統的目的。在Mybatis Mapper Xml中&#xff0c;#變量名稱創建參數化查詢SQL語句,不會導致SQL注入。而$變量名稱…

SPSS信度分析

前言&#xff1a; 本專欄參考教材為《SPSS22.0從入門到精通》&#xff0c;由于軟件版本原因&#xff0c;部分內容有所改變&#xff0c;為適應軟件版本的變化&#xff0c;特此創作此專欄便于大家學習。本專欄使用軟件為&#xff1a;SPSS25.0 本專欄所有的數據文件請點擊此鏈接下…

內網滲透之Linux權限提升大法

文章目錄 內網滲透|Linux權限提升大法0x01 前言0x02 工具介紹1.traitor2.LinEnum3.linux-exploit-suggester.sh4.Linux Exploit Suggester 25.beroot 0X02提權手法1.環境變量提權2.利用suid提權3.定時任務提權3.1定時任務文件覆蓋提權3.2定時任務tar命令通配符注入提權 4.sudo提…

【matlab程序】matlab給風速添加圖例大小

【matlab程序】matlab給風速添加圖例大小 clear;clc;close all; % load 加載風速數據。 load(matlab.mat) % 加載顏色包信息 gray load(D:\matlab_work\函數名為colormore的顏色索引表制作\R_color_txt\R_color_single\gray89.txt); brown load(D:\matlab_work\函數名為color…

_STORAGE_WRITE_ERROR_ thinkphp報錯問題原因

整個報錯內容如下 Uncaught exception Think\Exception with message _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/1338db9dec777aab181d4e74d1bdf964.php in C:\inetpub\wwwroot\ThinkPHP\Common\functions.php:101 Stack trace: #0 C:\inetpub\wwwroot\ThinkPHP\Library\…

1. 應用編程概念

1. 應用編程概念 1 系統調用概念1 應用編程和裸機編程、驅動編程的區別 1 系統調用概念 系統調用其實是 Linux 內核提供給應用層的應用編程接口&#xff0c;是 Linux 應用層進入內核的入口。用戶通過系統調用來使用系統提供的各種服務&#xff0c;實現了與內核的交互。 1 應用…

JavaFx 設置窗口邊框圓角

UI界面要求窗口邊框有一定弧度&#xff0c;因為之前沒有做過&#xff0c;網上看了很多文章&#xff0c;都用到了css語句 "-fx-background-radius: ; 我在xml布局文件根節點使用無效&#xff0c;在Scene組件設置無效&#xff0c;gpt等ai問了一圈代碼也是無效&#xff0c;…

【JavaEE】認識多線程

作者主頁&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感謝你閱讀本文&#xff0c;歡迎一建三連哦。 本文錄入于《vaEE》專欄&#xff0c;本專欄是針對于大學生&#xff0c;編程小白精心打造的。筆者用重金(時間和精力)打造&am…

React + BraftEditor 實現富文本編輯

Braft Editor 是一個基于 React 和 Draft-js 開發的富文本編輯器&#xff0c;提供了豐富的基礎功能&#xff0c;如基本文本格式化、列表、鏈接、圖片上傳、視頻插入等&#xff0c;并且還支持擴展。 首先&#xff0c;確保你已經在項目中安裝了 Braft Editor 和它的依賴項&#x…

NPU、CPU、GPU算力及算力計算方式

NVIDIA在9月20日發布的NVIDIA DRIVE Thor 新一代集中式車載計算平臺&#xff0c;可在單個安全、可靠的系統上運行高級駕駛員輔助應用和車載信息娛樂應用。提供 2000 萬億次浮點運算性能&#xff08;2000 萬億次8位浮點運算&#xff09;。NVIDIA當代產品是Orin&#xff0c;算力是…

Java基礎(問題+答案)——第4期

其他的幾期見這個專欄 Java中的多態性&#xff08;Polymorphism&#xff09;&#xff1a; 多態性是指一個對象可以用來引用多個類型的特性。在Java中&#xff0c;多態性通過方法的重寫和接口實現來實現。 Java中的final關鍵字的用途&#xff1a; final可以用于變量、方法和類。…

堪比數據恢復大師軟件推薦,恢復數據很簡單!

“作為一個經常丟失數據的電腦用戶來說&#xff0c;我覺得我非常需要一些簡單有效的數據恢復方法。大家有什么比較靠譜的軟件推薦嗎&#xff1f;非常感謝&#xff01;” 在數字化時代&#xff0c;數據的存儲是比較重要的。很多用戶都會選擇將重要的文件保存在電腦上。如果數據丟…