先说状况:php
多客户端对redis的同一键的值进行操做.html
我使用的语言:phpmysql
我使用的框架:这不重要redis
直接来看解决方案:sql
$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是单线程仍是多线程的.this
watch(看,监视,监听):spa
事务相关,watch一个redis的key.当redis进入事务后,若watch的key在其余地方发生了改变.
其余地方:当前客户端之外的客户端.
则当前事务将执行失败.队列中的全部操做将做废.
multi:
redis进入事务的语法,在个人项目中,是用multi()方法进入.
能够传两个值:Redis:MULTI以及Redis:PIPELINE;
multi以及pipeline的区别:
multi:当事务发生错误事务队列将做废.
pipeline:根本就不是事务!只是单纯的将任务放在队列中,相似于mysql中的存储过程.
exec(execution 执行)
执行当前事务,将队列中的任务一块儿执行,返回bool值
参考资料: