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

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

May 29, 2023 pm 08:17 PM
mysqlredis

  需求起因

#   在高並發的業務場景下,資料庫大多數情況都是使用者並發存取最薄弱的環節。所以,就需要使用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刪除
MySQL的許可與其他數據庫系統相比如何?MySQL的許可與其他數據庫系統相比如何?Apr 25, 2025 am 12:26 AM

MySQL使用的是GPL許可證。 1)GPL許可證允許自由使用、修改和分發MySQL,但修改後的分發需遵循GPL。 2)商業許可證可避免公開修改,適合需要保密的商業應用。

您什麼時候選擇InnoDB而不是Myisam,反之亦然?您什麼時候選擇InnoDB而不是Myisam,反之亦然?Apr 25, 2025 am 12:22 AM

選擇InnoDB而不是MyISAM的情況包括:1)需要事務支持,2)高並發環境,3)需要高數據一致性;反之,選擇MyISAM的情況包括:1)主要是讀操作,2)不需要事務支持。 InnoDB適合需要高數據一致性和事務處理的應用,如電商平台,而MyISAM適合讀密集型且無需事務的應用,如博客系統。

在MySQL中解釋外鍵的目的。在MySQL中解釋外鍵的目的。Apr 25, 2025 am 12:17 AM

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

MySQL中有哪些不同類型的索引?MySQL中有哪些不同類型的索引?Apr 25, 2025 am 12:12 AM

MySQL中有四種主要的索引類型:B-Tree索引、哈希索引、全文索引和空間索引。 1.B-Tree索引適用於範圍查詢、排序和分組,適合在employees表的name列上創建。 2.哈希索引適用於等值查詢,適合在MEMORY存儲引擎的hash_table表的id列上創建。 3.全文索引用於文本搜索,適合在articles表的content列上創建。 4.空間索引用於地理空間查詢,適合在locations表的geom列上創建。

您如何在MySQL中創建索引?您如何在MySQL中創建索引?Apr 25, 2025 am 12:06 AM

toCreateAnIndexinMysql,usethecReateIndexStatement.1)forasingLecolumn,使用“ createIndexIdx_lastNameEnemployees(lastName); 2)foracompositeIndex,使用“ createIndexIndexIndexIndexIndexDx_nameOmplayees(lastName,firstName,firstName);” 3)forauniqe instex,creationexexexexex,

MySQL與Sqlite有何不同?MySQL與Sqlite有何不同?Apr 24, 2025 am 12:12 AM

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是什麼?它們如何提高性能?MySQL中的索引是什麼?它們如何提高性能?Apr 24, 2025 am 12:09 AM

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

說明如何使用MySQL中的交易來確保數據一致性。說明如何使用MySQL中的交易來確保數據一致性。Apr 24, 2025 am 12:09 AM

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

See all articles

熱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

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

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

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

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具