Redis的并发竞争问题的解决方案总结
2018-01-30 15:52
555 查看
什么是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 price get price $price $price = $price + 10 multi set price $price exec
解释一下:
watch这里表示监控该key值,后面的事务是有条件的执行,如果从watch的exec语句执行时,watch的key对应的value值被修改了,则事务不会执行。
具体看Redis的事务功能详解这篇文章里的watch命令介绍。
方案4
这个是针对客户端来的,在代码里要对redis操作的时候,针对同一key的资源,就先进行加锁(java里的synchronized或lock)。方案5
利用redis的setnx实现内置的锁。相关文章推荐
- python 多并发竞争微信token刷新问题的解决方案
- Redis的并发竞争问题如何解决
- Redis 并发, 锁, 竞争锁问题
- Redis 并发, 锁, 竞争锁问题.
- 发锁事务重试机制(JPA高并发下的乐观锁异常)总结,以及中间遇到各种问题和解决方案
- redis使用乐观锁时处理竞争问题,高并发时失败率高如何解决
- java web开发 高并发问题处理【总结】
- 使用VS2010时遇到的一些小问题的解决方案(从各处搜罗总结的,不定期更新,向原作者致敬)
- redis实现商城中的秒杀并发问题思路
- jedispool 连 redis 高并发卡死 解决方案
- redis并发问题
- Android WebView常见问题的解决方案总结----例如Web page not available
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- Web服务器高并发的解决方案&TCP沾包问题&服务器TIME_WAIT异常
- memcach高并发数据失效的问题解决方案
- 大型网站应用之海量数据和高并发解决方案总结一二
- 常见浏览器兼容性问题与解决方案总结
- android sqlite数据库并发问题的详细描述和解决方案
- Spring并发访问的线程安全性问题(高度总结)
- redis渗透中的getshell问题总结