首頁 資料庫 mysql教程 Redis快取和MySQL資料一致性的方法

Redis快取和MySQL資料一致性的方法

May 29, 2023 pm 08:17 PM
mysql redis

  需求起因

#   在高並發的業務場景下,資料庫大多數情況都是使用者並發存取最薄弱的環節。所以,就需要使用redis做一個緩衝操作,讓請求先存取到redis,而不是直接存取MySQL等資料庫。

  這個業務場景,主要是解決讀取資料從Redis緩存,通常都是按照下圖的流程來進行業務操作。

  讀取快取步驟一般沒有什麼問題,但是一旦涉及到資料更新:資料庫和快取更新,就容易出現快取(Redis)和資料庫(MySQL)間的資料一致性問題。

  不管是先寫MySQL資料庫,再刪除Redis快取;還是先刪除緩存,再寫庫,都有可能出現資料不一致的狀況。舉個例子:

  1.如果刪除了快取Redis,還沒來得及寫庫MySQL,另一個執行緒就來讀取,發現快取為空,則去資料庫中讀取資料寫入緩存,此時快取中為髒資料。

  2.如果先寫了庫,在刪除緩存前,寫庫的線程宕機了,沒有刪除掉緩存,則也會出現資料不一致情況。

  因為寫入和讀取是並發的,沒辦法保證順序,就會出現快取和資料庫的資料不一致的問題。

  如來解決?這裡給出兩個解決方案,先易後難,結合業務和技術代價選擇使用。

  快取與資料庫一致性解決方案

  1.第一種方案:採用延時雙刪策略

#   在寫庫前後都進行redis.del(key)操作,並且設定合理的逾時時間。

  偽代碼如下

#   public void write(String key,Object data){

  redis.delKey(key);

#   db.updateData(data);

#   Thread.sleep(500);

#   redis.delKey(key);

#   }

#   2.具體的步驟是:

  1)先刪除快取

  2)再寫資料庫

  3)休眠500毫秒

  4)再次刪除快取

  那麼,這個500毫秒怎麼確定的,具體該休眠多久呢?

  需要評估自己的專案的讀取資料業務邏輯的耗時。這麼做的目的,就是確保讀取請求結束,寫入請求可以刪除讀取請求造成的快取髒資料。

  當然這種策略還要考慮redis和資料庫主從同步的耗時。最後的的寫入資料的休眠時間:則在讀取資料業務邏輯的耗時基礎上,加幾百ms即可。如:休眠1秒。

  3.設定快取過期時間

  從理論上來說,給快取設定過期時間,是保證最終一致性的解決方案。所有的寫入操作以資料庫為準,只要到達快取過期時間,則後面的讀取請求自然會從資料庫讀取新值然後回填快取。

  4.該方案的弊端

  結合雙刪策略 快取逾時設置,這樣最差的情況就是在超時時間內資料存在不一致,而且又增加了寫入請求的耗時。

  2、第二種方案:非同步更新快取(基於訂閱binlog的同步機制)

#   1.技術整體思路:

  MySQL binlog增量訂閱消費 訊息佇列 增量資料更新到redis

#   1)讀Redis:熱數據基本上都在Redis

  2)寫MySQL:增刪改都是操作MySQL

  3)更新Redis資料:MySQ的資料操作binlog,來更新到Redis

  2.Redis更新

  1)資料運算主要分為兩大塊:

#   一個是全量(將全部資料一次寫入redis)

  一個是增量(即時更新)

  這裡說的是增量,指的是mysql的update、insert、delate變更資料。

  2)讀取binlog後分析 ,利用訊息佇列,推播更新各台的redis快取資料。

  這樣一旦MySQL中產生了新的寫入、更新、刪除等操作,就可以把binlog相關的訊息推送至Redis,Redis再根據binlog中的記錄,對Redis進行更新。

  其實這種機制,很類似MySQL的主從備份機制,因為MySQL的主備也是透過binlog來實現的資料一致性。

  這裡可以結合使用canal(阿里的一款開源框架),透過該框架可以對MySQL的binlog進行訂閱,而canal正是模仿了mysql的slave資料庫的備份請求,使得Redis的資料更新達到了相同的效果。

  當然,這裡的訊息推播工具你也可以採用別的第三方:kafka、rabbitMQ等來實現推播更新Redis。

以上是Redis快取和MySQL資料一致性的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

REDIS的角色:探索數據存儲和管理功能 REDIS的角色:探索數據存儲和管理功能 Apr 22, 2025 am 12:10 AM

Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

laravel8 的優化點 laravel8 的優化點 Apr 18, 2025 pm 12:24 PM

Laravel 8 針對性能優化提供了以下選項:緩存配置:使用 Redis 緩存驅動、緩存門面、緩存視圖和頁面片段。數據庫優化:建立索引、使用查詢範圍、使用 Eloquent 關係。 JavaScript 和 CSS 優化:使用版本控制、合併和縮小資產、使用 CDN。代碼優化:使用 Composer 安裝包、使用 Laravel 助手函數、遵循 PSR 標準。監控和分析:使用 Laravel Scout、使用 Telescope、監控應用程序指標。

Spring Boot中OAuth2Authorization對象Redis緩存失敗怎麼辦? Spring Boot中OAuth2Authorization對象Redis緩存失敗怎麼辦? Apr 19, 2025 pm 08:03 PM

SpringBoot中使用Redis緩存OAuth2Authorization對像在SpringBoot應用中,使用SpringSecurityOAuth2AuthorizationServer...

See all articles