Redis使用过程中踩到的坑

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

  4. 对一个已经带有过期时间的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);
    }
  5. SET命令:如果key已经持有其他值,set会覆写旧值,无视类型。
    如果不希望string类型覆盖其他类型的RedisKey,可以在set之前通过TYPE 命令判断key的类型

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

猜你喜欢

转载自blog.csdn.net/weixin_36453463/article/details/80486390