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
-