Redis系列教程(七):Redis并发竞争key的解决方案详解
Redis高并發(fā)的問題
Redis緩存的高性能有目共睹,應(yīng)用的場景也是非常廣泛,但是在高并發(fā)的場景下,也會出現(xiàn)問題:
高并發(fā)架構(gòu)系列:Redis緩存和MySQL數(shù)據(jù)一致性方案詳解
如何解決Redis緩存雪崩、緩存穿透、緩存并發(fā)等5大難題
以及今天要談到的Redis并發(fā)競爭問題,這里的并發(fā)指的是多個redis的client同時set key引起的并發(fā)問題。
比如:多客戶端同時并發(fā)寫一個key,一個key的值是1,本來按順序修改為2,3,4,最后是4,但是由于并發(fā)設(shè)置的原因,最后順序變成了4,3,2,最后變成的key值成了2。
如何解決Redis的并發(fā)競爭key問題
第一種方案:分布式鎖
1.整體技術(shù)方案
這種情況,主要是準備一個分布式鎖,大家去搶鎖,搶到鎖就做set操作。
2.為什么是分布式鎖
因為傳統(tǒng)的加鎖的做法(如java的synchronized和Lock)這里沒用,只適合單點。因為這是分布式環(huán)境,需要的是分布式鎖。
當(dāng)然,分布式鎖可以基于很多種方式實現(xiàn),比如zookeeper、redis等,不管哪種方式實現(xiàn),基本原理是不變的:用一個狀態(tài)值表示鎖,對鎖的占用和釋放通過狀態(tài)值來標識。
3.分布式鎖的要求
- 互斥性:在任意一個時刻,只有一個客戶端持有鎖。
- 無死鎖:即便持有鎖的客戶端崩潰或者其他意外事件,鎖仍然可以被獲取。
- 容錯:只要大部分Redis節(jié)點都活著,客戶端就可以獲取和釋放鎖
4.分布式鎖的實現(xiàn)方式
- 數(shù)據(jù)庫
- Memcached(add命令)
- Redis(setnx命令)
- Zookeeper(臨時節(jié)點)
具體的分布式鎖實現(xiàn),請參考:阿里P8架構(gòu)師談:分布式鎖的3種實現(xiàn)(數(shù)據(jù)庫、緩存、Zookeeper)
第二種方案:利用消息隊列
在并發(fā)量過大的情況下,可以通過消息中間件進行處理,把并行讀寫進行串行化。
把Redis.set操作放在隊列中使其串行化,必須的一個一個執(zhí)行。
這種方式在一些高并發(fā)的場景中算是一種通用的解決方案。
你可能也喜歡:
總結(jié)
以上是生活随笔為你收集整理的Redis系列教程(七):Redis并发竞争key的解决方案详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud源码分析(一)E
- 下一篇: @FeignClient中的@Reque