課程
/后端開發
/Java
/Java高并發秒殺API之高并發優化
按老師視頻的方案,若多個線程并發訪問,當redis中沒有數據時,都會去請求數據庫,然后同時往redis中寫入相同key的值,請問怎么解?
2018-07-05
源自:Java高并發秒殺API之高并發優化 2-1
正在回答
這個問題挺好的,確實會出現多線程并發問題,可能會出現同時往redis中寫入相同key的值,但是對結果沒有影響吧,也可以解決:就是在redis中不存在要去訪問數據庫的時候加上鎖。
使用互斥鎖(mutex key) ;簡單點講就是類似“鎖”的機制,在緩存更新或者過期的情況下,先獲取鎖,在進行更新或者從數據庫中獲取數據后,再釋放鎖,需要一定的時間等待,就可以從緩存中繼續獲取數據
String get(String key){ ? ?String value = redis.get(key); ? ?if(value == null){ ? ? ? ?if(redis.setnx(key_Mutex),"1"){ ? ? ? ? ? ?redis.expire(key_mutex,3*60);//防止死鎖 ? ? ? ? ? ?value = db.get(key); ? ? ? ? ? ?redis.set(key,value); ? ? ? ? ? ?resdis.delete(key_Mutex); ? ? ? ?}else{ ? ? ? ? ? ?Thread.sleep(50); ? ? ? ? ? ?get(key); ? ? ? ?} ? ?} }
舉報
Java實現高并發秒殺API的第四門課,小伙伴一定可以從中受益
2 回答如何模擬高并發
1 回答關于高并發下,如何保證庫存不會超賣
2 回答Redis測試 Debug的時候,seckill為空
2 回答如果seckill的信息被更新了怎么辦
2 回答java高并發
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2019-02-26
這個問題挺好的,確實會出現多線程并發問題,可能會出現同時往redis中寫入相同key的值,但是對結果沒有影響吧,也可以解決:就是在redis中不存在要去訪問數據庫的時候加上鎖。
2018-07-10
使用互斥鎖(mutex key) ;簡單點講就是類似“鎖”的機制,在緩存更新或者過期的情況下,先獲取鎖,在進行更新或者從數據庫中獲取數據后,再釋放鎖,需要一定的時間等待,就可以從緩存中繼續獲取數據
String get(String key){ ? ?String value = redis.get(key); ? ?if(value == null){ ? ? ? ?if(redis.setnx(key_Mutex),"1"){ ? ? ? ? ? ?redis.expire(key_mutex,3*60);//防止死鎖 ? ? ? ? ? ?value = db.get(key); ? ? ? ? ? ?redis.set(key,value); ? ? ? ? ? ?resdis.delete(key_Mutex); ? ? ? ?}else{ ? ? ? ? ? ?Thread.sleep(50); ? ? ? ? ? ?get(key); ? ? ? ?} ? ?} }