Redis 生产环境、redis 集群禁止使用 keys 命令(使用 scan 代替)
Redis 生产环境、redis 集群禁止使用 keys 命令(使用 scan 代替)
·
生产环境、redis 集群禁止使用 keys 命令(使用 scan 代替)
同时执行keys命令的同时,Redis进程将被阻塞,无法执行其他命令,假如超过了哨兵的down-after-milliseconds配置,还会进行主从切换,切换过程中,如果主节点恢复正常,还可能出现脑裂等一系列问题。
代替代码示例
keys 示例
Set<String> keys = stringRedisTemplate.keys(SESSION_CACHE_PREFIX + "*");
assert keys != null;
for (String key : keys) {
// seckill:sessions:1645092000000_1645099200000
String[] val = key.replace(SESSION_CACHE_PREFIX, "").split("_");
long startTime = Long.parseLong(val[0]);
long endTime = Long.parseLong(val[1]);
if (currentTime > startTime && currentTime < endTime) {
BoundHashOperations<String, String, String> ops = stringRedisTemplate.boundHashOps(SKUKILL_CACHE_PREFIX);
// 获取所有秒杀商品
List<String> sessionIds = stringRedisTemplate.opsForList().range(key, 0, -1);
assert sessionIds != null;
List<String> skuValList = ops.multiGet(sessionIds);
assert skuValList != null;
if (skuValList.size() > 0) {
List<SeckillSkuRedisTO> collect = skuValList.stream().map(item -> {
SeckillSkuRedisTO seckillSkuRedisTo = JSONObject.parseObject((String) item, SeckillSkuRedisTO.class);
return seckillSkuRedisTo;
}).collect(Collectors.toList());
return collect;
}
break;
}
}
scan 示例
ScanOptions options = ScanOptions.scanOptions()
.count(10000)
.match(SESSION_CACHE_PREFIX + "*")
.build();
RedisSerializer<String> redisSerializer = (RedisSerializer<String>) stringRedisTemplate.getKeySerializer();
Cursor<String> cursor = stringRedisTemplate.executeWithStickyConnection(redisConnection ->
new ConvertingCursor<>(redisConnection.scan(options), redisSerializer::deserialize));
List<String> list = new ArrayList<>();
assert cursor != null;
while (cursor.hasNext()) {
list.add(cursor.next());
}
System.out.println("list = " + list);
cursor.close()
更多推荐
已为社区贡献3条内容
所有评论(0)