Redis中如何对Set与Hash的键执行SINTER交集操作
结论:可以实现,你之前命令报错的原因是 SINTER 仅支持对Set类型的键执行交集运算,你传入的键b是Hash类型,类型不匹配因此抛出错误。
以下是两种常用的实现方案:
方案1:Lua脚本原子计算(适合临时查询、数据量中等场景)
直接执行以下Lua脚本即可拿到交集,全程原子执行,不会出现并发数据不一致问题:
-- 调用时传入2个参数:第一个是Set的键名,第二个是Hash的键名 local set_members = redis.call('SMEMBERS', KEYS[1]) local hash_keys = redis.call('HKEYS', KEYS[2]) local hash_key_map = {} local result = {} -- 先把Hash的所有键存入字典做O(1)查找 for _, key in ipairs(hash_keys) do hash_key_map[key] = true end -- 遍历Set成员匹配Hash键 for _, member in ipairs(set_members) do if hash_key_map[member] then table.insert(result, member) end end return result
调用示例:
EVAL "上述Lua脚本完整内容" 2 a b
如果数据量很小且对一致性要求不高,也可以分别在客户端获取Set a的所有成员、Hash b的所有键,直接在客户端内存中计算交集即可。
方案2:提前维护Hash对应的键Set(适合高频查询、性能要求高的场景)
如果这个交集查询是高频操作,可以给Hash b额外维护一个存储它所有键的Set b:keys,每次对b执行HSET/HDEL等修改键的操作时,同步更新b:keys:
- 新增/修改Hash键时同步执行
SADD b:keys 键名 - 删除Hash键时同步执行
SREM b:keys 键名
后续要做交集查询时,直接执行原生SINTER即可,性能极高:
SINTER a b:keys
内容的提问来源于stack exchange,提问作者Oleg Yablokov
相关产品推荐
相关产品推荐

