Redis-場景緩存+秒殺+管道+消息隊列

緩存一致性

1.兩次更新

  • 先更新數據庫,再更新緩存;
  • 先更新緩存,再更新數據庫;

出現不一致問題場景:

先更新數據庫,再更新緩存;

先更新緩存,再更新數據庫;

兩次更新的適用場景:

????????如果我們的業務對緩存命中率(一定要用到緩存)有很高的要求,我們可以采用「更新數據庫 + 更新緩存」的方案,因為更新緩存并不會出現緩存未命中的情況

?解決緩存不一致的辦法

  • 在更新緩存前先加個分布式鎖,保證同一時間只運行一個請求更新緩存,就會不會產生并發問題了,當然引入了鎖后,對于寫入的性能就會帶來影響。
  • 在更新完緩存時,給緩存加上較短的過期時間,這樣即時出現緩存不一致的情況,緩存的數據也會很快過期,對業務還是能接受的。

2.更新+刪除策略

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

出現問題的場景

請求A更新 請求B讀取

解決辦法

延遲雙刪:

????????請求A先刪除緩存然后再更新數據庫,再給A加個睡眠時間,主要是為了確保其他請求完成讀操作寫入的緩存,然后請求 A 睡眠完,再刪除緩存。

????????所以,請求 A 的睡眠時間就需要大于請求 B 「從數據庫讀取數據 + 寫入緩存」的時間。

但是具體睡眠多久其實是個玄學,很難評估出來,所以這個方案也只是盡可能保證一致性而已,極端情況下,依然也會出現緩存不一致的現象。

因此,還是比較建議用「先更新數據庫,再刪除緩存」的方案。

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

請求A讀取?請求B更新

上圖是可能出現不一致的場景,但是在實際中,這個問題出現的概率并不高因為緩存的寫入通常要遠遠快于數據庫的寫入。

出現問題的場景:

?????「先更新數據庫, 再刪除緩存」其實是兩個操作,在刪除緩存(第二個操作)的時候可能會失敗,導致緩存中的數據是舊值,而數據庫是最新值

確保刪除成功的辦法
消息隊列重試機制

????????我們可以引入消息隊列,將第二個操作(刪除緩存)要操作的數據加入到消息隊列,由消費者來操作數據。

  • 如果應用刪除緩存失敗,可以從消息隊列中重新讀取數據,然后再次刪除緩存,這個就是重試機制。當然,如果重試超過的一定次數,還是沒有成功,我們就需要向業務層發送報錯信息了。
  • 如果刪除緩存成功,就要把數據從消息隊列中移除,避免重復操作,否則就繼續重試。

缺點是,對代碼入侵性比較強,因為需要改造原本業務的代碼。

訂閱 MySQL binlog,再操作緩存

????????如果是MySQL、Redis緩存同步場景,為了保證成功率,可以用一個消費服務訂閱MySQL binlog 日志,拿到具體要操作的數據,然后再向Redis執行緩存刪除操作。

更具體的說法:

????????可以通過訂閱 binlog 日志,拿到具體要操作的數據,然后再執行緩存刪除,阿里巴巴開源的 Canal 中間件就是基于這個實現的。

????????Canal 模擬 MySQL 主從復制的交互協議,把自己偽裝成一個 MySQL 的從節點,向 MySQL 主節點發送 dump 請求,MySQL 收到請求后,就會開始推送 Binlog 給 Canal,Canal 解析 Binlog 字節流之后,將binlog日志采集發送到MQ隊列里面,然后編寫一個簡單的緩存刪除消息者訂閱binlog日志,根據更新log刪除緩存,并且通過ACK機制確認處理這條更新log,保證數據緩存一致性。

八股總結

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

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

相關文章

[Windows] 字體渲染 mactype v2025.4.11

[Windows] 字體渲染 mactype 鏈接:https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可變字體支持已到來。 本版本將可變字體支持擴展到所有 GDI 應用程序。 所有 win32 程序中的字體,如 Noto Sans、Se…

【C++】深拷貝與淺拷貝

重開也不是不可能 ~.~ 淺拷貝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 構造函數&#xff0c;初始化指針成員ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…

SpringBoot企業級開發之【用戶模塊-更新用戶頭像】

功能如下所示&#xff1a; 我們先看一下接口文檔&#xff1a; 為什么頭像是一串字符串呢&#xff1f;因為我們是將頭像圖片放到第三方去存儲&#xff0c;比如&#xff1a;阿里云等 開發思路&#xff1a; 實操&#xff1a; 1.controller 注意!這里使用【PatchMapping】注解…

vue3+vite+js項目引入electron構建跨平臺桌面應用

1.準備工作 ① 必要安裝node.js、vue、vite、electron、pnpm 本人用的node版本v18.17.1、vue版本^3.4.19、vite版本^3.2.7、electron版本^35.1.4 ② 開發調試打包安裝 "devDependencies": {"concurrently": "^9.1.2","electron-builder&…

(51單片機)串口通訊(串口通訊教程)(串口接收發送教程)

前言&#xff1a; 今天有兩個項目&#xff0c;分別為&#xff1a; 串口接收: 串口發送&#xff1a; 如上圖將文件放在Keli5 中即可&#xff0c;然后燒錄在單片機中就行了 燒錄軟件用的是STC-ISP&#xff0c;不知道怎么安裝的可以去看江科大的視頻&#xff1a; 【51單片機入門…

《汽車制造技術基礎》第一次作業

作業內容 查閱相關資料&#xff0c;談談對汽車制造技術的發展的理解。 可以是關于汽車的先進制造技術 或 汽車先進制造技術 與 制造理念的發展趨勢 或 汽車先進制造技術對環境與可持續發展的影響等。 以下從技術突破、制造理念轉型及環境影響三個維度展開對汽車制造技…

Scala day4(tuple, set and map)

Foreword Hi!! my dear friends, are you lazy at today?? Oh! I am also lazy sometimes, but you will know keep study that’s a right way at last. Now!! let’s start new travel about Scala. Text The all Codes in file day3.scala, like the below program: i…

docker compose搭建博客wordpress

一、前言 docker安裝等入門知識見我之前的這篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…

第二期:[特殊字符] 深入理解MyBatis[特殊字符]MyBatis基礎CRUD操作詳解[特殊字符]

前言 &#x1f31f; 在掌握了 MyBatis 的基本配置與環境搭建之后&#xff0c;接下來的重點便是深入理解其核心功能——CRUD 操作&#xff08;增刪改查&#xff09;。&#x1f4bb; 數據庫操作是任何應用開發中不可或缺的一環&#xff0c;而 MyBatis 正是通過靈活的 SQL 映射機…

Java面試黃金寶典46

1. Python 如何寫爬蟲 定義:Python 爬蟲是借助 Python 語言編寫程序,模擬瀏覽器行為向目標網站發送 HTTP 請求,獲取網頁內容,再通過解析工具提取所需數據的程序。其本質是自動化的數據采集過程。要點: 發送請求:利用requests庫發送 HTTP 請求,如 GET、POST 等,獲取網頁…

建設“大數據智慧招商平臺”,助力園區突破招商瓶頸!

在數字經濟高速發展的今天&#xff0c;傳統招商模式正面臨信息不對稱、效率低下、匹配不精準等瓶頸。產業園區作為區域經濟發展的核心載體&#xff0c;亟需借助智能化手段提升招商效能。構建大數據智慧招商平臺&#xff0c;利用大數據、人工智能等技術獲取精準招商線索、促進產…

Vue事件修飾符課堂練習

Vue事件修飾符課堂練習 題目?&#xff1a;基于 Vue 2.0&#xff0c;使用事件修飾符 .stop、.prevent、.capture、.self 和 .once&#xff0c;為按鈕綁定 click 事件&#xff0c;并展示每個修飾符的作用。 要求?&#xff1a; 創建一個 Vue 實例&#xff0c;并綁定到一個 HT…

【C#】線程回調

在 C# 中&#xff0c;線程回調是一種常見的編程模式&#xff0c;用于在線程完成任務后執行某些操作。通過使用 Thread 類或其他更高層次的并發工具&#xff08;如 Task&#xff09;&#xff0c;可以實現線程回調的功能。 回調機制 特點 直接性&#xff1a;回調通常是通過委托…

【C++游戲引擎開發】第14篇:視圖空間與相機坐標系

一、視圖空間的基礎數學框架 1.1 齊次坐標與變換矩陣 三維坐標系變換采用44齊次坐標矩陣,其通用形式為: M = [ A 3 3 b 3 1 0 1 3 1 ] \mathbf{M} = \begin{bmatrix} \mathbf{A}_{33} & \mathbf{b}_{31} \\ \mathbf{0}_{13} & 1 \end{bmatrix} M=[A33?013??…

【大模型理論篇】關于生成式模型中聯合分布概率學習必要性以及GPT是生成式模型的討論

1. 背景 之前我們在《生成式模型與判別式模型對比(涉及VAE、CRF的數學原理詳述)》以及《生成式模型算法原理深入淺出&#xff08;涉及Stable Diffusion、生成對抗網絡、高斯混合模型、隱馬爾可夫模型、樸素貝葉斯等算法原理分析及生成式模型解釋&#xff09;》中&#xff0c;我…

DIP支付方式改革下各種疾病醫療費用的影響以及分析方法研究綜述

DIP支付方式改革下各種疾病醫療費用的影響以及分析方法研究綜述 摘要 本文綜述了DIP支付方式改革對不同疾病醫療費用的影響及其分析方法&#xff0c;通過分析12篇相關文獻&#xff0c;探討了DIP支付方式在控制醫療費用、優化費用結構、提升醫療服務效率等方面的作用及其局限性…

嵌入式硬件篇---單片機周期

文章目錄 前言 前言 在單片機中&#xff0c;時序控制是其執行指令和協調外設的核心基礎。以下是單片機中常見的各種周期及其詳細說明&#xff0c;以層次結構展開&#xff1a; 時鐘周期&#xff08;Clock Cycle&#xff09; 定義&#xff1a; 時鐘周期是單片機的最小時間單位&a…

游戲引擎學習第221天:(實現多層次過場動畫)

資產: intro_art.hha 已發布 在下載頁面&#xff0c;你會看到一個新的藝術包。你將需要這個藝術包來進行接下來的開發工作。這個藝術包是由一位藝術家精心制作并打包成我們設計的格式&#xff0c;旨在將這些藝術資源直接應用到游戲中。它包含了許多我們會在接下來的直播中使用…

【3GPP核心網】【5G】精講5G系統的策略和計費控制框架

1. 歡迎大家訂閱和關注,精講3GPP通信協議(2G/3G/4G/5G/IMS)知識點,專欄會持續更新中.....敬請期待! 目錄 1. 系統架構 1.1 非漫游架構 1.2 漫游架構 1.3 支持Rx接口 2. 服務化接口及參考點 2.1 PCF 與 AF 間接口 2.2 PCF與SMF間接口 2.3 PCF與AMF間接口 2.4 V-PC…

榕壹云門店管理系統:基于Spring Boot+Mysql+UniApp的智慧解決方案

項目背景&#xff1a;數字化賦能服務行業&#xff0c;破解傳統門店管理痛點 在消費升級與數字化轉型浪潮下&#xff0c;傳統服務行業&#xff08;如美容、美發、美甲、采耳等&#xff09;面臨諸多管理挑戰&#xff1a;會員流失率高、預約排班混亂、員工績效統計低效、數據孤島等…