You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:17:47