1. 程式人生 > 其它 >在庫存服務中實現快取與資料庫雙寫一致性保障方案(一)

在庫存服務中實現快取與資料庫雙寫一致性保障方案(一)

庫存服務和資料庫雙寫一致性方案

庫存服務架子搭起來了,訪問資料都是ok的,解決方案都分析過了。
我們需要把思路進行程式碼實現。
1.系統啟動的時候初始化執行緒池和相關記憶體佇列。
2.兩種請求物件的封裝,1種發生交易進行庫存更新,2是讀庫存可能在商品頁面讀的時候先讀快取
,如果快取裡面它正好清空了,傳送讀請求到庫存服務裡來,讀請求過來的時候,會申請把資料庫最新值查詢出來更新到快取中。
3.封裝好之後封裝操作邏輯,對請求物件執行service,封裝controller,扔給非同步執行service,根據標識,根據商品標識取出hash值,
對hash值取模,扔到記憶體佇列裡面去,監聽記憶體佇列執行緒池裡的執行緒,消費執行緒。
把對同一個商品更新庫存,讀取庫存更新快取進行序列化。
4.讀請求的去重優化,一個佇列裡,對一個商品的庫存的資料庫更新操作已經在記憶體佇列中了,
對商品庫存的讀取操作,要求讀取庫存資料庫資料,然後更新到快取中,一下子過來多個讀,
這多個讀其實只要有一個讀請求操作壓到佇列裡就可以了,其他的讀操作全部都wait,讀請求的操作重新整理快取就可以讀到快取中的最新資料了。
5.空資料的過濾優化,如果讀請求發現redis快取中沒有資料,就會發送讀請求給庫存服務,
此時快取中為空,可能因為寫請求先刪除了快取,也可能資料庫中壓根沒有這條資料。如果是資料庫壓根沒有這條資料的場景,
就不應該將讀請求操作壓入佇列中,而是直接返回空就可以了。

這兩個操作都是為了減少記憶體佇列中的請求積壓,記憶體佇列中積壓的請求越多,就可能導致每個讀請求hang住的時間越長,也可能導致多個讀請求被hang住,儘量把一定要執行的壓倒記憶體佇列中。

本文來自部落格園,作者:三號小玩家,轉載請註明原文連結:https://www.cnblogs.com/q1359720840/p/15864092.html