Redis的并发竞争问题是什么?如何解决这个问题?了解Redis事务的CAS方案吗?

1,255 阅读2分钟

1.问题:某个时刻,多个系统实例都要去更新某个key

用分布式锁解决,一般还是用zookeeper的分布式锁,redis里的分布式锁可以用但是实际生产环境中用的很少

确保同一时间只有一个实例在操作某个key,每次写之前判断一下value的时间戳是否比缓存里value的时间戳更新,如果更新 那么就可以写,否则不能用旧的数据去覆盖新的数据!!

注意这里是因为 更新!! 对key的更新 一般要先删除缓存,然后写到mysql里面去,这个时候是有先后顺序的,也就是v1 v2 v3 v4 这个顺序去写的! 所以在缓存更新的时候也必须是这个顺序! 可以用分布式锁来解决,还有就是时间戳!!

2.分布式锁 和 事务有什么关系? watch 以及 Mysql里的MVCC是什么关系

MVCC(客观上,我们认为他就是乐观锁的一整实现方式,就是每行都有版本号,保存时根据版本号决定是否成功。但由于Mysql的写操作会加排他锁(前文有讲),如果锁定了还算不算是MVCC?了解乐观锁的小伙伴们,都知道其主要依靠版本控制,即消除锁定,二者相互矛盾,so从某种意义上来说,Mysql的MVCC并非真正的MVCC,他只是借用MVCC的名号实现了读的非阻塞而已。)

3.问题:现在有两个操作一个是 setnx 150,一个是setnx 200,现在这两个操作发生并且最终结果必须是200,不可以采用锁,怎么实现?

  • 我自己猜的:

    • CAS...但是不能保证一定

    • redis 事务

    • 让两个操作一次性传到redis去...

    面试官说的:

    • redis得 watch 指令,加个版本号,相当于Mysql得MVCC