Jedis Scan无法找到任何Key:Redis集群全量Key获取异常排查
问题分析与解决方案
你这段代码扫不到Redis集群中的Key,核心问题出在匹配模式{*}的错误使用上,结合Redis集群的Slot哈希规则,我给你拆解下原因和修复方案:
为什么{*}匹配不到Key?
Redis集群会根据Key的哈希值分配Slot,而如果Key中包含{}包裹的部分(哈希标签),集群只会对{}内的内容计算哈希值来分配Slot。你的代码里用match("{*}"),意味着只会匹配本身包含{}且{}内是任意内容的Key——如果你的业务Key都是普通格式(比如没有{}前缀),那自然找不到任何结果。
修复方案
1. 匹配所有普通格式的Key
如果你的Key没有使用哈希标签(绝大多数场景都是如此),直接把匹配模式改成"*"即可:
public void testRedis() { String keyPattern = "*"; // 修正match参数为"*",匹配所有Key ScanParams scanParams = new ScanParams().count(1000).match(keyPattern); String cursor = "0"; // 确保初始游标是"0"(SCAN_POINTER_START要定义为这个值) do { ScanResult<String> scanResult = getRedisCluster().scan(cursor, scanParams); scanResult.getResult().forEach(System.out::println); cursor = scanResult.getStringCursor(); } while (!cursor.equals("0")); }
2. 针对带哈希标签的Key
如果你的业务Key确实用了哈希标签(比如{order}:10001、{user}:20002这种格式),需要根据实际标签前缀写匹配模式:
比如要匹配所有{order}开头的Key,就用match("{order}:*");如果要匹配所有带哈希标签的Key,才用match("{*}:*")(假设标签后有分隔符)。
额外注意事项
- 集群下扫描所有Key属于较重的操作,建议在业务低峰期执行,或者尽量缩小匹配范围(比如指定具体前缀)来提升效率。
- 确认
SCAN_POINTER_START常量的值是"0",这是Scan命令的初始游标,不能错写成其他值。
内容的提问来源于stack exchange,提问作者Twi
相关产品推荐
相关产品推荐

