为了账号安全,请及时绑定邮箱和手机立即绑定

第一次从DB中获取SecKill时,并发如何处理

按老师视频的方案,若多个线程并发访问,当redis中没有数据时,都会去请求数据库,然后同时往redis中写入相同key的值,请问怎么解?

正在回答

2 回答

这个问题挺好的,确实会出现多线程并发问题,可能会出现同时往redis中写入相同key的值,但是对结果没有影响吧,也可以解决:就是在redis中不存在要去访问数据库的时候加上锁。

0 回复 有任何疑惑可以回复我~

使用互斥锁(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);        }    } }

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

第一次从DB中获取SecKill时,并发如何处理

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信