在使用redis作為快取中介軟體時,在高併發的情況下,會出現快取失效的問題。
快取穿透、快取雪崩、快取擊穿。
對於快取穿透我們可以使用鎖來解決。本文講如何使用本地鎖來解決穿透問題。只適用於單體應用。
主業務方法:
@autowired
private stringredistemplate redistemplate;
private
final
static string category_json_key =
"category_json_key"
;public map
>
getcategorysjson()
);return longlistmap;
}// system.out.println("快取中沒有");
// 在資料庫中查詢資料
map> categorysjsonfromdb =
getcategorysjsonfromdb()
;// 沒有新增鎖之前不用去掉注釋,在獲取資料後直接儲存到redis
// 在redis快取中存資料 在鎖結束時儲存到快取中
// redistemplate.opsforvalue().set(category_json_key,json.tojsonstring(categorysjsonfromdb),1, timeunit.days);
return categorysjsonfromdb;
}
解決快取擊穿問題只要是同一把鎖,就能鎖住需要這個鎖的所有執行緒
synchronized(this),springboot所有的元件在容器中都是單例的
得到鎖之後,我們應該再去快取中確定一次,如果沒有才需要繼續查詢
private map
>
getcategorysjsonfromdb()
map> longlistmap = json.
parseobject
(s,new
typereference
>>()
);return longlistmap;
}}
缺點:如果在每個機器上都部署,每個this都是一把鎖,幾台機器就有幾個例項物件,想要鎖住所有,必須使用分布式鎖 樂觀鎖的使用 redis
悲觀鎖 什麼時候都出問題,無論做什麼都加鎖 樂觀鎖 什麼時候都不會出現問題,所以不會上鎖,更新資料的時候進行判斷,在此期間是否有人對資料進行了改變 獲取version,更新的時候比較version,監控 watch。事務正常結束,資料期間沒有發生改變,這個時候就正常執行成功,監視失敗,要放棄監視un...
使用redis鎖的正確姿勢
redis鎖的使用方式一般有三種,incr,setnx,set。incr命令會將key的值加一,如果key值不存在,則key值會被初始化為0,然後執行incr操作。127.0.0.1 6379 get lock 1234 nil 127.0.0.1 6379 incr lock 1234 integ...
redis鎖的實現
redis鎖的實現,有自己的工具類 import com.yoho8.framework.cache.icache import com.yoho8.framework.cache.bean.key import com.yoho8.framework.enums.moduleenum import...