一尘不染

Redis中的高效索引类型操作

redis

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

像这样:

inx:haircolor:金发=设置(key1,key2,key3)
inx:eyecolor:blue =设置(key1,key2)

而且我可以sinter用来查找所有金发和蓝眼睛的钥匙。

我有这样的哈希:

key1:名称=瑞克发色=金发眼色=蓝色

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

这只是演示数据,以使其更易于理解,我正在使用它来存储分析数据,并且我需要进行一些大型的键查找。

我可以想到的2个选项是流水线多获取+ 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

这将所有处理保留在数据库端。


阅读 515

收藏
2020-06-20

共1个答案

一尘不染

获取键列表然后执行一些操作以获取值几乎是处理此问题的唯一方法。对于实验性的Lua脚本,它看起来确实是一个很好的用例,尽管没有它,您可能也可以相当有效地获得密钥-
在看到实际的性能问题之前,数字必须非常大。

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

2020-06-20