美文网首页程序员
Redis使用过程中踩到的坑

Redis使用过程中踩到的坑

作者: GeorgeMR | 来源:发表于2018-05-15 20:49 被阅读0次
    1. redis(WRONGTYPE Operation against a key holding the wrong kind of value)

      前提是: key-list类型的数据,存为了key-value形式

      • 则使用rightPop取出列表数据时会报错

      • 改为使用key-list存数据,依然会报错

      解决方法: 删除之前存错格式的数据

    2. redis的管道操作

      Redis管道技术可以在服务端未响应时,客户端继续向服务端发送请求,并最终一次性读取所有服务端的响应。

      所有在管道内拿不到redis操作的值

    3. 使用scan代替keys (scan命令不能在管道中使用)

      因为keys命令会一次性地遍历整个数据库来获取所有与给定模式相匹配的键,所以随着数据库包含的键值对越来越多,执行速度也会越来越慢

      scan命令以渐进的方式,分多次遍历整个数据库,并返回匹配给定模式的键。

    Redis的keys和scan命令.png

    scan命令使用的算法可以保证,遍历从开始到结束期间,一直存在于数据库里面的键肯定会被遍历到。但中途被删除或者中途添加的键是否会被遍历到则是不确定的。另外,命令可能会返回同一个键多次。

    1. 对一个已经带有过期时间的key执行 EXPIRE 命令,新指定的过期时间会取代旧的过期时间
      如果不希望在每次更新值的时候更新过期时间,可以在执行 expire 命令之前通过TTL 命令来判断对应key是否已经设置了过期时间或是否过期。

      TTL 命令返回给定key的剩余生存时间(秒),key不存在返回-2,key存在但没有设置过期时间返回-1

      //RedisTemplate的getExpire内部封装的就是TTL命令
      if (routerRedisTemplate.getExpire(key) < 0) {
          //设置100s的过期时间
       routerRedisTemplate.expire(key, 100, TimeUnit.SECONDS);
      }
      
    2. SET命令:如果key已经持有其他值,set会覆写旧值,无视类型。
      如果不希望string类型覆盖其他类型的RedisKey,可以在set之前通过TYPE 命令判断key的类型

      if (routerRedisTemplate.hasKey(key) && Objects.equals(DataType.STRING,routerRedisTemplate.type(key))) {
                       addRedisStringKey(key, value, expireTime);
      }
      

    相关文章

      网友评论

        本文标题:Redis使用过程中踩到的坑

        本文链接:https://www.haomeiwen.com/subject/awgydftx.html