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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:27:03