ERR invalid expire time in setex

ERR invalid expire time in setex


异常背景

  • 通过有效期的截止时间减去当前时间获取缓存生效时间
  • long seconds = bo.getEndTime().getTime() - System.currentTimeMillis();
  • 在存储生效时间时,对时间Long进行强制转换时 (int)seconds发生异常

异常原因

  • 异常信息

    redis.clients.jedis.exceptions.JedisDataException: ERR invalid expire time in setex
    at redis.clients.jedis.Protocol.processError(Protocol.java:115) ~[jedis-2.6.1.jar:na]
    at redis.clients.jedis.Protocol.process(Protocol.java:141) ~[jedis-2.6.1.jar:na]
    at redis.clients.jedis.Protocol.read(Protocol.java:196) ~[jedis-2.6.1.jar:na]
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:283) ~[jedis-2.6.1.jar:na]
    at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:182) ~[jedis-2.6.1.jar:na]
    at redis.clients.jedis.Jedis.setex(Jedis.java:422) ~[jedis-2.6.1.jar:na]

  • 异常分析

    • 数值类型强制转换发生溢出,缓存失效时间为负数

      bo.getEndTime().getTime() - System.currentTimeMillis();
      // 得到 long 型数据 2169331921L 
      // 再将 long 转 int 时,使用 (int) seconds 发生溢出 -2125635375
      long seconds = 2169331921L;
      System.out.println((int) seconds);
      //  -2125635375
      
    • Redis 失效时间赋值源码1

      //如果定义了key的过期时间
      if (expire) {
          //从expire对象中取出值,保存在milliseconds中,如果出错发送默认的信息给client
          if (getLongLongFromObjectOrReply(c, expire, &milliseconds, NULL) != C_OK)
              return;
          // 如果过期时间小于等于0,则发送错误信息给client
          if (milliseconds <= 0) {
              addReplyErrorFormat(c,"invalid expire time in %s",c->cmd->name);
              return;
          }
          //如果unit的单位是秒,则需要转换为毫秒保存
          if (unit == UNIT_SECONDS) milliseconds *= 1000;
      }
      
    • 缓存失效时间小于0时,抛出异常

      • 失效时间 < 0 ,-1L

  1. Redis源码剖析和注释(九)— 字符串命令的实现(t_string) ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值