生产环境、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()
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐