先说情况:
多客户端对redis的同一键的值进行操作.
我使用的语言:php
我使用的框架:这不重要
直接来看解决方案:
$this->_redis->watch('a'); $a=$this->_redis->get('a'); $a++; $pipe=$this->_redis->multi(Redis::MULTI); $pipe->set('a',$a); return $pipe->exec();
接下来是redis相关知识:
首先你得有一个redis相关的库,我把redis的实例赋给了$this->_redis.
然后你得知道redis是单进程单线程的,本身是不会出现并发的问题.
那么问题来了:php是单进程还是多进程的,js是单线程还是多线程的.
watch(看,监视,监听):
事务相关,watch一个redis的key.当redis进入事务后,若watch的key在其他地方发生了改变.
其他地方:当前客户端以外的客户端.
则当前事务将执行失败.队列中的所有操作将作废.
multi:
redis进入事务的语法,在我的项目中,是用multi()方法进入.
可以传两个值:Redis:MULTI以及Redis:PIPELINE;
multi以及pipeline的区别:
multi:当事务发生错误事务队列将作废.
pipeline:根本就不是事务!只是单纯的将任务放在队列中,类似于mysql中的存储过程.
exec(execution 执行)
执行当前事务,将队列中的任务一起执行,返回bool值
参考资料: