关于Redis的并发竞争问题如何解决

 当我们有2个甚至多个线程去操作一个redis里的值时,

比如我拿到商品的剩余库存要去相减,

首先第一个线程拿到的库存是10 要减去1

第二个拿到的也是10 也要减一,

我们期望的情况下是最后库存是8

但是按照现在这种情况,我们虽然不需要保证执行的顺序性(无论哪个先减都没关系,只要最终能到8就行),但数据的准确性也没得到保障。

解决方案

方案1

利用redis自带的incr命令,decr命令(本人项目中用的便是这个)。

方案2

可以使用独占锁的方式,类似操作系统的mutex机制。(有点困难)

方案3

使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高)

watch price

get price $price

$price = $price + 10

multi

set price $price

exec复制代码

解释一下:

watch这里表示监控该key值,后面的事务是有条件的执行,如果从watch的exec语句执行时,watch的key对应的value值被修改了,则事务不会执行。

方案4

这个是针对客户端来的,在代码里要对redis操作的时候,针对同一key的资源,就先进行加锁(java里的synchronized或lock)。

方案5

利用redis的setnx实现内置的锁。

参考:https://www.cnblogs.com/shamo89/p/8385390.html


转载于:https://juejin.im/post/5be4fb6c6fb9a049f66b9a9f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值