redis集群中scan需用{} hashtag确保key路由至同一节点,如user:{1001}:profile;pattern须匹配{}内内容,如"user:{1001}*";php应使用redis::scan()而非keys,并配合crc16校验slot与正则提取tag防误匹配。

Redis集群中key命名必须带{} hashtag才能被SCAN正确路由
直接在Redis集群里用SCAN匹配*user*这种通配符,大概率查不到结果——因为集群不保证所有匹配的key落在同一个节点上。客户端会把*user*发给随机一个节点,而其他节点上的key根本不会被扫描到。
真正能走通的方案,是让所有目标key共享同一个哈希槽,也就是强制它们路由到同一节点。Redis靠{}里的内容做哈希计算,所以key必须写成类似user:{1001}:profile或order:{202406}:items的形式。
-
{1001}和{202406}才是实际参与CRC16哈希的部分,外面的user:和:profile只是前缀/后缀,不影响路由 - PHP写入时就得规范:
$redis->set('user:{1001}:profile', $data),不能漏掉{} - 后续用
SCAN匹配时,pattern必须严格对应{}内的内容,比如scanParams.match("user:{1001}*") - 如果想批量扫某个业务域的所有key,得统一用相同tag,比如全用
{user_service},再扫*{user_service}*
preg_match_all提取key时要防误匹配{}外的字符
你从日志、配置或调试输出里提取Redis key,常会遇到像"key=user:{1001}:profile"这样的字符串。如果正则写成/\{(\w+)\}/,可能把user:{1001}和profile中间的{}也捕获进来——但那不是hashtag,只是普通花括号。
安全做法是锚定hashtag结构:它必须紧贴key名的一部分,且前后不能是字母数字(否则会被当成普通内容)。推荐用这个模式:
~(?
(?确保<code>{前面不是单词字符(排除abc{123}这种)-
(?![a-zA-Z0-9])确保}后面也不是单词字符(排除{123}def) - 中间
[a-zA-Z0-9._-]+覆盖常见tag字符集,不包含空格和冒号 - PHP调用:
preg_match_all($pattern, $logLine, $matches); $tag = $matches[1][0] ?? '';
PHP集群客户端执行SCAN必须用phpredis的scan方法,别用keys
KEYS命令在集群模式下直接报错:CROSSSLOT Keys in request don't hash to the same slot。即使你只传一个pattern,底层也会拒绝执行。
phpredis扩展的Redis::scan()才是正确入口,它自动处理重试和游标迭代:
- 第一个参数是游标(初始为
"0"),不是key名;返回新游标和一批key,需循环直到游标变回"0" - pattern参数必须是字符串,不能是正则表达式——
SCAN只支持glob风格:*、?、[abc],不支持\d+或^ - count建议设为
1000,太小效率低,太大阻塞单个节点;实测count=5000在万级key下仍可控 - 示例:
$redis->scan($cursor, 'user:{1001}*');,注意这里$cursor是引用传参,每次调用后会更新
跨节点扫描时,preg_match要配合slot校验避免重复或遗漏
方案二(遍历所有主节点)看似暴力,但实际线上排查很实用。问题在于:不同节点返回的key列表可能有重叠(比如某节点故障后部分slot被迁移),也可能遗漏(比如你没过滤从节点)。
安全做法是在获取每个节点的key后,用CRC16手动校验是否真属于该节点负责的slot范围:
- PHP里可用
crc16($key) % 16384算出slot,再对比该节点的CLUSTER SLOTS返回值 - 或者更简单:只对主节点调用
KEYS,并加if (!str_contains($info, 'role:slave'))过滤 - 提取到key后,用
preg_match二次过滤比单纯依赖SCAN更稳,例如:preg_match('/^user:\{[0-9]+\}:[a-z]+$/i', $key) - 最后合并结果用
array_unique($allKeys, SORT_STRING)去重,别信“每个节点绝对不重”这种假设
真正麻烦的不是语法,而是{}位置不对、slot没对齐、或误把日志里的伪key当真实key——这些错误在线上跑一天都未必暴露,等缓存雪崩才看到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











