大併發訪問同乙個不存在的cache的兩個解決方法

2021-09-01 17:52:10 字數 696 閱讀 6343

這是一種典型的大併發訪問同乙個不存在的cache的情形,

因此對於可預先知道的快取,可以採取在程式啟動的時候就生成。

對於這種無法預知key的,以論壇帖子列表為例,可以採取兩種策略,

1.第乙個發現cache中沒有快取物件時,先放入乙個空的臨時物件,

比如返回list,可以先生成乙個長度為0的arraylist,同時將生成快取的操作放到佇列中或者由當前執行緒完成,再將生成的資料替換剛才的臨時快取物件。

這種做法的缺點是,如果生成快取的時間較長,那麼會有一部分請求得到的不是實際資料,影響部分使用者體驗。且如果當前生成快取的時候出現異常,需要等剛才的臨時快取失效之後,才會再次觸發生成快取的請求。

優點是編寫**簡單,即使該快取永遠無法生成,也不會出發太多的生成快取的操作。

不怕使用者惡意請求來產生過多的無法命中的快取。

屬於犧牲少量使用者體驗來保障系統的穩定的做法。主要用於重要性較低的業務。

2.用申請鎖的方式將生成快取的操作以同步方式進行,

優點是基本不會出現取到方法1中的那種臨時快取,

缺點是,**編寫稍複雜,生成快取操作耗時太久或出現問題,或者網路故障等其它原因導致該快取永遠無法生成的時候,

那麼每次呼叫過讀取該快取的請求,都將被拖住,嚴重的時候整個伺服器執行緒佔滿被拖垮。

一旦使用者惡意請求導致快取無法名字,伺服器很容易被搞掛。

根據實際業務選擇吧。

參考:

asp如何判斷乙個目標頁面存在還是不存在

1,假設對方的伺服器沒有設定 訪問到不存在的頁面就自動跳轉到其它頁面,或者做了乙個專門的404頁面 2,假設對方沒有做任何設定,如果頁面不存在,就輸出乙個我們常見的乙個 網頁無法找到 的頁面 現在,我們通過什麼方法判斷目標頁面是否真的存在或者不存在?上面 情況1 我寫錯了,應該是 假設對方的伺服器設...

MySQL如果不存在乙個表則建立

一 問題起因 在前幾天從同事那裡拿來demo研究的時候,發現資料庫名,部分表都一樣,只是有的表沒有,這時如果需要把兩個人的資料庫和成乙個資料庫,就需要處理判斷一張表不存在,如存在則不改動,若不存在,則執行建立。在同事那裡拿到這個資料庫的轉存檔案,然後去手動改動這個.sql轉存檔案對一些自己不確定自己...

多執行緒併發同乙個表問題

table for update for update of a.id a1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 a,b直接封鎖a,b表...