1. 程式人生 > 遊戲 >JRPG遊戲《英雄傳說黎之軌跡》戰術篇視訊 2月10日正式發售

JRPG遊戲《英雄傳說黎之軌跡》戰術篇視訊 2月10日正式發售

從四方面進行敘述

1、傳統的快取使用方式為:

​ 讀的時候,先讀快取,快取中沒有資料的話,就讀資料庫,然後將資料取出,存入快取並返回。更新資料時,先將資料更新資料庫,然後在刪除快取。

2、為什麼是刪除快取而不是更新快取:

​ 在現實場景下快取的資料不僅僅是資料庫直接讀取出來的值,可能需要和資料庫中其他資料聚合,再次聚合計算後寫入快取的話,加大了效能消耗。

​ 其實刪除快取是一個Lazy計算的思想。

3、初級的不一致問題及解決方案:

​ 問題:更新資料庫後,刪除快取出錯,導致資料庫是新資料快取中是舊資料。

​ 處理方式:先刪除快取,再更新資料庫。

​ 如果刪除快取出錯,資料庫不會修改,兩者都是舊資料;如果更新資料庫出錯,讀取時,快取中是空的,資料庫是舊的,那麼兩者都是舊資料,可解決不一致問題。

4、較複雜的不一致問題及解決方案:

​ 問題:資料發生了變更,先刪除了快取,然後要去修改資料庫,此時還沒修改。一個請求過來,去讀快取,發現快取空了,去查詢資料庫,查到了修改前的舊資料,放到了快取中。隨後資料變更的程式完成了資料庫的修改,導致資料庫是新資料快取中是舊資料。

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

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

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

​ 待那個佇列對應的工作執行緒完成了上一個操作的資料庫的修改之後,才會去執行下一個操作,也就是快取更新的操作,此時會從資料庫中讀取最新的值,然後寫入快取中。

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