為什么會出現競爭問題?
多客戶端同時並發寫一個key,一個key的值是1,本來按順序修改為2,3,4,最后是4,但是順序變成了4,3,2,最后變成了2。
第一種方案:分布式鎖+時間戳
分布式鎖可以使用redis自身的分布式鎖,也可以使用zookeeper,但是一般使用后者,
由於上面舉的例子,要求key的操作需要順序執行,所以需要保存一個時間戳判斷set順序。
系統A key 1 {ValueA 7:00}
系統B key 1 { ValueB 7:05}
假設系統B先搶到鎖,將key1設置為{ValueB 7:05}。接下來系統A搶到鎖,發現自己的key1的時間戳早於緩存中的時間戳(7:00<7:05),那就不做set操作了;
這種方案的前提是要保證各系統的時間是一樣的,如果不能保證可以采用分布式鎖+版本號的方式。
第二種方案:利用消息隊列
在並發量過大的情況下,可以通過消息中間件進行處理,把並行讀寫進行串行化。
把Redis.set操作放在隊列中使其串行化,必須的一個一個執行。