-
redis(WRONGTYPE Operation against a key holding the wrong kind of value)
前提是: key-list类型的数据,存为了key-value形式
-
则使用rightPop取出列表数据时会报错
-
改为使用key-list存数据,依然会报错
解决方法: 删除之前存错格式的数据
-
-
redis的管道操作
Redis管道技术可以在服务端未响应时,客户端继续向服务端发送请求,并最终一次性读取所有服务端的响应。
所有在管道内拿不到redis操作的值
-
使用scan代替keys (scan命令不能在管道中使用)
因为keys命令会一次性地遍历整个数据库来获取所有与给定模式相匹配的键,所以随着数据库包含的键值对越来越多,执行速度也会越来越慢
scan命令以渐进的方式,分多次遍历整个数据库,并返回匹配给定模式的键。
scan命令使用的算法可以保证,遍历从开始到结束期间,一直存在于数据库里面的键肯定会被遍历到。但中途被删除或者中途添加的键是否会被遍历到则是不确定的。另外,命令可能会返回同一个键多次。
-
对一个已经带有过期时间的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); }
-
SET命令:如果key已经持有其他值,set会覆写旧值,无视类型。
如果不希望string类型覆盖其他类型的RedisKey,可以在set之前通过TYPE
命令判断key的类型if (routerRedisTemplate.hasKey(key) && Objects.equals(DataType.STRING,routerRedisTemplate.type(key))) { addRedisStringKey(key, value, expireTime); }
网友评论