问答详情
源自:2-1 redis后端缓存优化编码

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

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

提问者:dengcl 2018-07-05 16:58

个回答

  • 慕粉1852402560
    2019-02-26 15:06:11

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

  • study_workSpace
    2018-07-10 10:29:51

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