当并发的魔爪伸向了redis,关键词:php,ci框架,redis,并发

先说情况:

 

多客户端对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值

 

 

 

 

参考资料:

 

posted @ 2017-03-01 17:44  JOSEFA  阅读(219)  评论(0编辑  收藏  举报
shopify traffic stats View My Stats