redis的本地鎖的使用

2021-10-24 06:41:10 字數 1415 閱讀 8304

在使用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...