redis订阅执行一段时间自动停止_面试系列 redis 分布式锁amp;数据一致性
生活随笔
收集整理的這篇文章主要介紹了
redis订阅执行一段时间自动停止_面试系列 redis 分布式锁amp;数据一致性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分布式鎖
多個系統同時操作一個redis,因為jvm鎖是線程級別的,所以沒有辦法鎖住多個系統。
Redis鎖實現:
- setnx key value 只有在key不存在時設置key的值
- 此時key相當于鎖的唯一標識,若key存在則會返回失敗
- EXPIRE key timeout 設置帶過期時間的key,動態設置
- 保證即使鎖沒有被顯式釋放,鎖也可以在一定時間后自動釋放,避免資源被永遠鎖住(萬一拿到鎖之后掛了就不會被顯式釋放)。
SETNX 和 EXPIRE 非原子性
- 如果 SETNX 成功,在設置鎖超時時間后,服務器掛掉、重啟或網絡問題等,導致 EXPIRE 命令沒有執行,鎖沒有設置超時時間變成死鎖。
- 使用 lua 腳本保證原子性
鎖誤解除
本質上就是redis自動刪除鎖和主動刪除鎖的重復沖突
如果線程 A 成功獲取到了鎖,并且設置了過期時間 30 秒,但線程 A 執行時間超過了 30 秒,鎖過期自動釋放,此時線程 B 獲取到了鎖;隨后 A 執行完成,線程 A 使用 DEL 命令來釋放鎖,但此時線程 B 加的鎖還沒有執行完成,線程 A 實際釋放的線程 B 加的鎖。
超時解鎖導致并發
如果線程 A 成功獲取鎖并設置過期時間 30 秒,但線程 A 執行時間超過了 30 秒,鎖過期自動釋放,此時線程 B 獲取到了鎖,線程 A 和線程 B 并發執行。
解決方案:
- 保證鎖不會自動過期自動刪除,就算程序掛了,依然是有過期時間不會造成死鎖。
- 這個線程必須是主線程的守護線程,如果主線程掛了,定時任務也會掛了
鎖等待
- 可以通過客戶端輪詢的方式解決該問題,當未獲取到鎖時,等待一段時間重新獲取鎖,直到成功獲取鎖或等待超時。這種方式比較消耗服務器資源,當并發量比較大時,會影響服務器的效率。
- 另一種方式是使用 Redis 的發布訂閱功能,當獲取鎖失敗時,訂閱鎖釋放消息,獲取鎖成功后釋放時,發送鎖釋放消息。
整理來源
分布式鎖的實現之 redis 篇
《吊打面試官》系列-Redis終章_凜冬將至 FPX_新王登基
RedLock
基于 Redis 的分布式鎖到底安全嗎? 待整理
Redis與Mysql雙寫一致性方案解析
根據緩存是刪除還是更新,以及操作順序大概是可以分為下面四種情況
更新緩存 VS 刪除緩存
- 更新緩存的優點: 緩存不會增加一次Miss,命中率高
- 刪除緩存的優點: 操作簡單,能防止更新出現的線程安全問題
通常場景下刪除緩存操作簡單,并且帶來的副作用只是增加了一次Cache Miss,建議作為通用的處理方式,因為:
- 更新緩存的代價可能很高,因為可能摻雜復雜的數據計算,而且頻繁的更新緩存并不代表它會被頻繁的訪問到。舉個栗子:一個緩存涉及的表的字段,在 1 分鐘內就修改了 20 次,或者是 100 次,那么緩存更新 20 次、100 次;但是這個緩存在 1 分鐘內只被讀取了 1 次,有大量的冷數據。
- 刪除緩存,而不是更新緩存,就是一個 Lazy 計算的思想,不要每次都重新做復雜的計算,不管它會不會用到,而是讓它到需要被使用的時候再重新計算。
Redis與數據庫一致性 | 筆記 詳情
總結
以上是生活随笔為你收集整理的redis订阅执行一段时间自动停止_面试系列 redis 分布式锁amp;数据一致性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逛公园看见不同的花卉场景,这样拍照更出片
- 下一篇: java与ios_JAVA和IOS区别是