Redis緩存的高性能有目共睹,應用的場景也是很是普遍,可是在高併發的場景下,也會出現問題:java
今天要談到的Redis併發競爭問題,這裏的併發指的是多個redis的client同時set key引發的併發問題。redis
好比:多客戶端同時併發寫一個key,一個key的值是1,原本按順序修改成2,3,4,最後是4,可是因爲併發設置的緣由,最後順序變成了4,3,2,最後變成的key值成了2。數據庫
高併發架構系列:Redis併發競爭key的解決方案詳解緩存
這種狀況,主要是準備一個分佈式鎖,你們去搶鎖,搶到鎖就作set操做。架構
由於傳統的加鎖的作法(如java的synchronized和Lock)這裏沒用,只適合單點。由於這是分佈式環境,須要的是分佈式鎖。併發
固然,分佈式鎖能夠基於不少種方式實現,好比zookeeper、redis等,無論哪一種方式實現,基本原理是不變的:用一個狀態值表示鎖,對鎖的佔用和釋放經過狀態值來標識。分佈式
具體的分佈式鎖實現,請參考:阿里P8架構師談:分佈式鎖的3種實現(數據庫、緩存、Zookeeper)高併發
在併發量過大的狀況下,能夠經過消息中間件進行處理,把並行讀寫進行串行化。性能
把Redis.set操做放在隊列中使其串行化,必須的一個一個執行。中間件
這種方式在一些高併發的場景中算是一種通用的解決方案。