当我们有2个甚至多个线程去操作一个redis里的值时,
比如我拿到商品的剩余库存要去相减,
首先第一个线程拿到的库存是10 要减去1
第二个拿到的也是10 也要减一,
我们期望的情况下是最后库存是8
但是按照现在这种情况,我们虽然不需要保证执行的顺序性(无论哪个先减都没关系,只要最终能到8就行),但数据的准确性也没得到保障。
解决方案
方案1
利用redis自带的incr命令,decr命令(本人项目中用的便是这个)。
方案2
可以使用独占锁的方式,类似操作系统的mutex机制。(有点困难)
方案3
使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高)
解释一下:
watch这里表示监控该key值,后面的事务是有条件的执行,如果从watch的exec语句执行时,watch的key对应的value值被修改了,则事务不会执行。
方案4
这个是针对客户端来的,在代码里要对redis操作的时候,针对同一key的资源,就先进行加锁(java里的synchronized或lock)。
方案5
利用redis的setnx实现内置的锁。
参考:https://www.cnblogs.com/shamo89/p/8385390.html