博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis的并发竞争问题的解决方案总结
阅读量:7078 次
发布时间:2019-06-28

本文共 1006 字,大约阅读时间需要 3 分钟。

什么是Redis的并发竞争问题

Redis的并发竞争问题,主要是发生在并发写竞争。

考虑到redis没有像db中的sql语句,update val = val + 10 where ...,无法使用这种方式进行对数据的更新。

假如有某个key = "price",  value值为10,现在想把value值进行+10操作。正常逻辑下,就是先把数据key为price的值读回来,加上10,再把值给设置回去。如果只有一个连接的情况下,这种方式没有问题,可以工作得很好,但如果有两个连接时,两个连接同时想对还price进行+10操作,就可能会出现问题了。

例如:两个连接同时对price进行写操作,同时加10,最终结果我们知道,应该为30才是正确。

考虑到一种情况:

T1时刻,连接1将price读出,目标设置的数据为10+10 = 20。

T2时刻,连接2也将数据读出,也是为10,目标设置为20。

T3时刻,连接1将price设置为20。

T4时刻,连接2也将price设置为20,则最终结果是一个错误值20。

解决方案

方案1

利用redis自带的incr命令,具体用法看这里http://doc.redisfans.com/string/incr.html。

方案2

可以使用独占锁的方式,类似操作系统的mutex机制。(网上有例子,http://blog.csdn.net/black_ox/article/details/48972085 不过实现相对复杂,成本较高)

方案3

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

如何用乐观锁方式进行解决?

本质上是假设不会进行冲突,使用redis的命令watch进行构造条件。伪代码如下:

watch priceget price $price$price = $price + 10multiset price $priceexec

解释一下:

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

具体看这篇文章里的watch命令介绍。

方案4

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

方案5

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

你可能感兴趣的文章
Centos下安装Python3.6和Python2共存
查看>>
深入理解ES6笔记(二)字符串和正则表达
查看>>
一个小众的php方法:hypot
查看>>
python操作redis(二)
查看>>
我是如何学习小程序的
查看>>
从Web到未来
查看>>
JS-常用数组API、对象API与日期、随机数
查看>>
Nodejs操作MySQL-增删改查
查看>>
使用Docker搭建Squid代理服务器
查看>>
makefile规则
查看>>
【运维】nginx服务器基本配置指南
查看>>
Angular通过订阅观察者对象实现不同组件中数据的实时传递
查看>>
Bitmap的图片压缩汇总
查看>>
树莓派学习手记——制作一个空调遥控器(红外接收、发射的实现)
查看>>
《Maven实战》阅读总结(二)Maven仓库
查看>>
【369天】每日项目总结系列106(2018.02.09)
查看>>
WordPress 主题开发:从入门到精通(必读)
查看>>
Vue入坑记
查看>>
#ReactApp项目构建流程【3】
查看>>
canal 1.0.25 快速启动配置
查看>>