NODEID 参数,仅针对指定分片节点扫描。-ERR invalid cursor(master node idx out of range)NODEID 参数,可只扫描指定分片节点的数据,适用于按分片排查或分片级处理的场景。f2f3c387b9fab0e67af02039845c60278b13bed0,执行如下命令:scan 0 MATCH * COUNT 100 f2f3c387b9fab0e67af02039****************
cluster nodes 命令获取。NODEID 参数时,SCAN 将遍历集群所有分片的数据(需 Proxy 5.8.9及以上)。从游标 0 开始迭代,直到游标重新返回 0 表示遍历完成。package com.example.service.impl;public class RedisServiceImpl implements RedisService {// scan 最大重试次数private static final int MAX_RETRIES = 3;private final RedisConnectionFactory connectionFactory;@Overridepublic void scanKeys(String pattern, int count) {try (Jedis jedis = connectionFactory.getConnection()) {int retryCount = 0;boolean scanCompleted = false;// 对 scan 过程报错进行捕获,遇到报错从 0 开始重新扫描while (!scanCompleted && retryCount <= MAX_RETRIES) {String cursor = ScanParams.SCAN_POINTER_START;ScanParams scanParams = new ScanParams();scanParams.count(count);scanParams.match(pattern);try {while (true) {ScanResult<String> scanResult = jedis.scan(cursor, scanParams);List<String> keys = scanResult.getResult();if (!keys.isEmpty()) {processKeysWithBusinessLogic(keys); // 业务处理}cursor = scanResult.getCursor();// 游标为 "0" 时完成扫描if (cursor.equals(ScanParams.SCAN_POINTER_START)) {scanCompleted = true;break;}}} catch (Exception e) {retryCount++;// 超过最大重试次数,终止重试if (retryCount > MAX_RETRIES) {throw new RuntimeException("达到最大重试次数,扫描失败", e);}}}}}}
参数 / 逻辑 | 说明 |
MAX_RETRIES | SCAN 最大重试次数,示例为3,可按业务需要调整。 |
cursor | 游标,每轮扫描从起始位 0(ScanParams.SCAN_POINTER_START)开始,游标重新返回 0 表示遍历完成。 |
scanParams.match(pattern) | 按模式匹配 Key。 |
scanParams.count(count) | 每次迭代返回的元素数量提示。 |
异常捕获 | 捕获到游标失效等异常后,重试计数加1并从游标 0 重新扫描;超过 MAX_RETRIES 则抛出异常终止,避免死循环。 |
0 且 scanCompleted 为 true,表示已完整遍历,未陷入死循环。invalid cursor(master node idx out of range) 怎么办?0 并重新发起扫描,切勿忽略错误继续用原游标迭代,否则会进入死循环。0 重启扫描,超过重试上限则终止并抛出异常。NODEID 参数即可,具体命令写法以实例实际支持为准。文档反馈