按老师视频的方案,若多个线程并发访问,当redis中没有数据时,都会去请求数据库,然后同时往redis中写入相同key的值,请问怎么解?
这个问题挺好的,确实会出现多线程并发问题,可能会出现同时往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); } } }