【Redis小白-1】Redis INCRBY DECRBY INCR DECR 累加累减值异常或计数不准

使用Redis遇到的一些奇葩问题

今天用RabbitMq + Redis 做数据处理进度条功能

首先设置初始key value,因为要用到MQ所以给key都设置一个过期时间,就不用考虑删除的问题了

*** 错误示范 ***

//使用某个空间
$redis = RedisData::getInstance(RedisEnum::REDIS_CACHE_BLACK);
//初始化MQ
$mq = new MQFactory();
//***程序逻辑***
$list = //###### 搞出要处理的数据列表 #######
foreach($list as $v){
	//发送到MQ进行数据处理
	$mq->sendData('key',$v);
}
//存个总数- 搞个过期时间 - 你或许有其他方案
$redis->setex('PROCESS_TOTAL',count($list),1800);
//初始化要累加的key
$redis->setex('PROCESS_SUM',0,1800);

MQ的处理逻辑 - 简写了

public function handleData($key,$value){
	$redis = RedisData::getInstance(RedisEnum::REDIS_CATCH_BLOCK);
	//封装了一下,可以断线重连,使用 Redis的incrby方法进行累加
	$redis->_incrBy('PROCESS_SUM', 1);
	//以下是逻辑处理,然而并不重要
}

奇怪的事情发生了,PROCESS_SUM的每次执行结果都与PROCESS_TOTAL的值不一样
这是为什么,百思不得其姐……额,口误,百思不得其解
我还以为 Redis INCRBY DECRBY INCR DECR这几个方法有问题,百度、谷歌也没有这方面的内容,后来只能调试了
结果:嗯,方法确实没问题/-_-\ !!!

以上的废话看了么,如果在“错误示范”里已经找答案了,后面的也就不用看了【手动捂嘴偷乐 ^ _ ^ 】

*** 正确示范 ***

//使用某个空间
$redis = RedisData::getInstance(RedisEnum::REDIS_CACHE_BLACK);
//初始化MQ
$mq = new MQFactory();
//***程序逻辑***
$list = //###### 搞出要处理的数据列表 #######
//存个总数- 搞个过期时间 - 你或许有其他方案
$redis->setex('PROCESS_TOTAL',count($list),1800);
//初始化要累加的key
$redis->setex('PROCESS_SUM',0,1800);
foreach($list as $v){
	//发送到MQ进行数据处理
	$mq->sendData('key',$v);
}

看出来区别了么,没看出来不要紧,下面进行总结

应该看出来了吧

应该不用总结了吧

嗯,还有很多小白的

那还是总结一下吧

皮一下很开心 ^ _ ^

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    ↓↓↓↓↓↓↓↓↓↓↓↓↓
     ↓↓↓↓↓↓↓↓↓↓↓↓
      ↓↓↓↓↓↓↓↓↓↓↓
       ↓↓↓↓↓↓↓↓↓↓
        ↓↓↓↓↓↓↓↓↓
         ↓↓↓↓↓↓↓↓
          ↓↓↓↓↓↓↓
           ↓↓↓↓↓↓
            ↓↓↓↓↓
             ↓↓↓↓
              ↓↓↓
               ↓↓
                ↓

**是执行顺序的问题了,MQ本身可以理解为队列异步处理请求,“错误示范”里先循环发给MQ然后再设置Redis的key-value,但是这个时候MQ已经在处理数据了incrBy已经在执行了,后来又重新给PROCESS_SUM赋了0值,后来在队列里的数据又重新进行了累加,所以每次最终结果都和总数不匹配,“正确示范”里,我只是调整了一下执行顺序,就解决了这个问题。

Ps: 问题很小,但是遇到了也很恶心,总结经验,少犯低级错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值