快取的技術方案分析

2021-09-09 07:30:59 字數 2047 閱讀 7775

1.最初級的快取不一致問題以及解決方案

問題:

先修改資料庫,再刪除快取,如果刪除快取失敗了,那麼會導致資料庫中是新資料,快取中是舊資料,資料出現不一致

解決思路:

先刪除快取,再修改資料庫,如果刪除快取成功了,如果修改資料庫失敗了,那麼資料庫中是舊資料,快取中是空的,那麼資料不會不一致,因為讀的時候快取沒有,則讀資料庫中舊資料,然後更新到快取中

2、比較複雜的資料不一致問題分析

資料發生了變更,先刪除了快取,然後要去修改資料庫,此時還沒修改,乙個請求過來,去讀快取,發現快取空了,去查詢資料庫,查到了修改前的舊資料,放到了快取中,資料變更的程式完成了資料庫的修改,完了,資料庫和快取中的資料不一樣了。
3、資料庫與快取更新與讀取操作進行非同步序列化

更新資料的時候,根據資料的唯一標識,將操作路由之後,傳送到乙個jvm內部的佇列中,讀取資料的時候,如果發現資料不在快取中,那麼將重新讀取資料+更新快取的操作,根據唯一標識路由之後,也傳送同乙個jvm內部的佇列中

乙個佇列對應乙個工作執行緒

每個工作執行緒序列拿到對應的操作,然後一條一條的執行

這樣的話,乙個資料變更的操作,先執行,刪除快取,然後再去更新資料庫,但是還沒完成更新,此時如果乙個讀請求過來,讀到了空的快取,那麼可以先將快取更新的請求傳送到佇列中,此時會在佇列中積壓,然後同步等待快取更新完成

這裡有乙個優化點,乙個佇列中,其實多個更新快取請求串在一起是沒意義的,因此可以做過濾,如果發現佇列中已經有乙個更新快取的請求了,那麼就不用再放個更新請求操作進去了,直接等待前面的更新操作請求完成即可

如果請求還在等待時間範圍內,不斷輪詢發現可以取到值了,那麼就直接返回; 如果請求等待的時間超過一定時長,那麼這一次直接從資料庫中讀取當前的舊值

4、高併發的場景下,該解決方案要注意的問題

(1)讀請求長時阻塞

由於讀請求進行了非常輕度的非同步化,所以一定要注意讀超時的問題,每個讀請求必須在超時時間範圍內返回

該解決方案,最大的風險點在於說,可能資料更新很頻繁,導致佇列中積壓了大量更新操作在裡面,然後讀請求會發生大量的超時,最後導致大量的請求直接走資料庫務必通過一些模擬真實的測試,看看更新資料的頻繁是怎樣的

(2)讀請求併發量過高

這裡還必須做好壓力測試,確保恰巧碰上上述情況的時候,還有乙個風險,就是突然間大量讀請求會在幾十毫秒的延時hang在服務上,看服務能不能抗的住,需要多少機器才能抗住最大的極限情況的峰值,但是因為並不是所有的資料都在同一時間更新,快取也不會同一時間失效,所以每次可能也就是少數資料的快取失效了,然後那些資料對應的讀請求過來,併發量應該也不會特別大

(3)熱點商品的路由問題,導致請求的傾斜

萬一某個商品的讀寫請求特別高,全部打到相同的機器的相同的佇列裡面去了,可能造成某台機器的壓力過大

就是說,因為只有在商品資料更新的時候才會清空快取,然後才會導致讀寫併發,所以更新頻率不是太高的話,這個問題的影響並不是特別大

但是的確可能某些機器的負載會高一些

(4)為什麼更新快取一定要刪除快取,而不是直接更新

原因很簡單,很多時候,複雜點的快取的場景,因為快取有的時候,不簡單是資料庫中直接取出來的值

商品詳情頁的系統,修改庫存,只是修改了某個表的某些字段,但是要真正把這個影響的最終的庫存計算出來,可能還需要從其他表查詢一些資料,然後進行一些複雜的運算,才能最終計算出

現在最新的庫存是多少,然後才能將庫存更新到快取中去

比如可能更新了某個表的乙個字段,然後其對應的快取,是需要查詢另外兩個表的資料,並進行運算,才能計算出快取最新的值的

更新快取的代價是很高的

是不是說,每次修改資料庫的時候,都一定要將其對應的快取去跟新乙份?也許有的場景是這樣的,但是對於比較複雜的快取資料計算的場景,就不是這樣了

如果你頻繁修改乙個快取涉及的多個表,那麼這個快取會被頻繁的更新,頻繁的更新快取

但是問題在於,這個快取到底會不會被頻繁訪問到???

舉個例子,乙個快取涉及的表的字段,在1分鐘內就修改了20次,或者是100次,那麼快取跟新20次,100次; 但是這個快取在1分鐘內就被讀取了1次,有大量的冷資料

技術 技術方案優化策略 快取層面

兩種快取 什麼情況適合用快取?快取選型 什麼時候更新快取?如何保證更新的可靠性和實時性?更新快取的策略,需要具體問題具體分析。例如,目前約10萬個商品資料採用了redis作為快取服務,具體更新的策略有兩個 快取滿了怎麼辦?快取資料丟失怎麼辦?如果不允許,就需要帶持久化功能的快取服務來支援,比如red...

分析PHP中的快取技術

關於php的快取技術我個人的定義是可以分成3個類別1 快取模組這這個是在伺服器上做的快取設定,比如zend公司的cache產品等,主要原理是通過對php 檔案的一次編譯儲存在記憶體中,通過減少i o的操作來加快訪問速度,不在本文討論範圍之列2 html方式或許你說php生成html的方式不在本文討論...

快取穿透,快取雪崩,快取擊穿解決方案分析

目錄前言 快取穿透 快取雪崩 快取擊穿 總結 設計乙個快取系統,不得不要考慮的問題就是 快取穿透 快取擊穿與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失...