Redis中的高效索引类型操作

时间:2011-06-19 00:17:53

标签: redis

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

像这样:

  

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

我可以使用sinter查找金色头发和蓝眼睛的所有按键。

我有这样的哈希:

  

key1:name = Rick haircolor = blonde eyecolor = blue

获取结果键并检索匹配哈希值的最快方法是什么。

这只是演示数据,使其更容易理解,我使用它来存储分析,我需要做一些大量的键查找。

我能想到的两个选项是pipelining multi gets + 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 个答案:

答案 0 :(得分:3)

获取密钥列表然后做一些事情来获取值几乎是解决这个问题的唯一方法。对于实验性Lua脚本来说,它看起来确实是一个很好的用例,尽管如此,你可以相当有效地获得密钥 - 在看到真正的性能问题之前,数字需要非常大。

您可以进行其他优化,可能使用临时或有序集,或仅从每个散列中检索单个相关属性,但这些很大程度上取决于您尝试检索的数据类型。