Redis HSCAN是否支持通配符搜索?命令行与C# .NET Core实现问题求助
问题根因
你混淆了SCAN和HSCAN两个命令的作用范围:
SCAN是全局命令,用于遍历整个Redis实例的所有键,支持通过MATCH参数做键名的通配符匹配HSCAN是针对单个Hash类型键的命令,第一个参数必须是具体存在的Hash键名,用于遍历这个Hash内部的所有字段,不支持用通配符匹配多个键
你给HSCAN传products:*时,Redis只会去找键名就是products:*的Hash键,这个键显然不存在,所以返回空结果。
命令行端使用方案
如果你要先匹配所有符合products:*规则的Hash键,再逐个扫描内部字段,分两步执行:
- 先扫出所有匹配的键:
scan 0 match products:*
- 对返回的每个具体键,单独执行
HSCAN操作,比如拿到products:P121后执行:
hscan "products:P121" 0
如果只是要判断是否存在符合规则的Hash键,第一步执行完有返回结果就说明存在。
C#端解决方案
你用的StackExchange.Redis库中,HashScan方法对应Redis的HSCAN命令,所以传通配符键名自然返回空。正确实现逻辑如下:
前置注意
连接Redis的字符串需要开启allowAdmin=true配置,才能调用扫描相关接口。
示例代码
// 1. 先获取IServer实例,替换为你实际的Redis地址和端口 var server = s_redis.GetServer("127.0.0.1", 6379); var db = s_redis.GetDatabase(); // 2. 扫描所有匹配products:*的键,pageSize可根据数据量调整,避免单次返回过多 IEnumerable<RedisKey> matchedKeys = server.Keys(pattern: "products:*", pageSize: 100); int totalHashFieldCount = 0; foreach (RedisKey key in matchedKeys) { // 过滤非Hash类型的键,避免报错 if (db.KeyType(key) == RedisType.Hash) { // 仅统计字段总数直接用HashLength,性能更高 totalHashFieldCount += (int)db.HashLength(key); // 如果需要遍历字段做自定义判断,再调用HashScan // var hashFields = db.HashScan(key); // 自定义逻辑 } } // 此时totalHashFieldCount就是所有符合规则的Hash键的总字段数
性能优化
如果仅需要判断是否存在符合规则的Hash键,不需要统计总数,遍历matchedKeys时拿到第一个符合类型的键就可以直接终止遍历,返回存在即可。
内容的提问来源于stack exchange,提问作者user979189
相关产品推荐
相关产品推荐

