Redis中高效的索引类型操作

3

我正在尝试在Redis中创建一组索引,用于进行AND操作。

像这样:

inx:haircolor:blonde = set(key1,key2,key3)
inx:eyecolor:blue = set(key1,key2)

然后我可以使用 sinter 找到所有具有金发和蓝眼睛的关键字。

我有以下这种哈希表:

key1: name=Rick haircolor=blonde eyecolor=blue

最快的方法是什么,以便获取匹配的哈希表?

这只是演示数据,以使理解更容易。我使用它来存储分析数据,并且需要执行较大规模的关键字查找。

我能想到的两个选择是:管道化多个 get + exec 或者使用Lua脚本避免发送一堆键。

如果有更好的存储对象数据并对其进行索引的方法,或者一种有效的获取所有这些哈希表而不会向网络发送一堆id的方法,请告诉我!

编辑

我最终使用了LUA脚本(使用Redis脚本分支)。

local fkeys = redis.call('sinter', unpack(KEYS))
local r = {}
for i, key in ipairs(fkeys) do
  r[#r+1] = redis.call('hgetall',key)
end
return r

它将所有处理工作保持在数据库端。
1个回答

3
获取键列表,然后进行一些操作以获取值,这基本上是处理此问题的唯一方法。虽然看起来这是实验性Lua脚本的一个很好的用例,但即使没有它,您可能也可以相当高效地获取键 - 只有在数字非常大时才会看到真正的性能问题。
可能还有其他优化可供使用,例如使用临时或排序集合或仅从每个哈希中检索单个相关属性,但这些高度依赖于您尝试检索的数据类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接