第一次从DB中获取SecKill时,并发如何处理
按老师视频的方案,若多个线程并发访问,当redis中没有数据时,都会去请求数据库,然后同时往redis中写入相同key的值,请问怎么解?
按老师视频的方案,若多个线程并发访问,当redis中没有数据时,都会去请求数据库,然后同时往redis中写入相同key的值,请问怎么解?
2018-07-05
使用互斥锁(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); } } }
举报