Lua 如何根据Redis中的另一个集合按其concat值过滤任何集合
我在Redis中有一个过滤器优化问题 我有一个Redis集合,它将一种类型的doc和pos对保存在一个语料库中 例如:Lua 如何根据Redis中的另一个集合按其concat值过滤任何集合,lua,redis,Lua,Redis,我在Redis中有一个过滤器优化问题 我有一个Redis集合,它将一种类型的doc和pos对保存在一个语料库中 例如: smembers type_in_docs.1 结果:doc.pos对 array (size=216627) 0 => string '2805.2339' (length=9) 1 => string '2410.14208' (length=10) 2 => string '3516.1810' (length=9) ... 我根据用户的选择创建了另
smembers type_in_docs.1
结果:doc.pos对
array (size=216627)
0 => string '2805.2339' (length=9)
1 => string '2410.14208' (length=10)
2 => string '3516.1810' (length=9)
...
我根据用户的选择创建了另一个实时redis集
它包含选定的文档
smembers filteredDocs
我想根据用户文档id选择过滤doc.pos对“在文档中键入”设置。
事实上,如果我不在集合中使用concat值,那么使用烧结矿就很容易了
因此,我实现了一个php过滤器代码,如下所示。
它可以工作,但需要优化。
在大医生对设置太多的时间需要。(接近15万会员!)
我尝试将分数作为docId进行排序。
Bu找不到分数值的相交或筛选选项
我正在考虑并搜索一个基于Redis的解决方案,该解决方案具有支持的键、集或Lua脚本,用于时间优化。
但什么也找不到
如何使用concat值过滤Redis集
感谢您的帮助。您的代码运行缓慢,主要是因为您正在将大量数据从Redis移动到PHP过滤器。这里的一般动机应该是在服务器上执行尽可能多的过滤。要做到这一点,您需要在CPU和RAM方面付出一定的代价 有很多方法可以做到这一点,这里有一个:
doc
,请保持您的doc.pos
对不变,但使用分数为0的排序集,例如:
ZADD type_in_docs.1 0 2805.2339 0 2410.14208 0 3516.1810
SISMEMBER
的doc
,包括:
ZRANGEBYLEX type_in_docs.1 [<$typeID> (<$typeID + "\xff">
首先感谢您详细的方法、脚本和即时回答。这种方法正是我所需要的。方法#5具体说明我想学习和应用的内容。这个方法让我在通过redis使用lua脚本时思路清晰。它激励我在我的博士项目中使用它作为另一个模块。我通过PHP Predis库执行lua脚本。非常成功!非常感谢你…我很高兴你喜欢它-请随时联系我的任何Redis(+Lua):),不要忘记将此作为答案。。。
ZRANGEBYLEX type_in_docs.1 [<$typeID> (<$typeID + "\xff">
-- @usage: redis-cli --filter_doc_pos.lua <filter set keyname> <type pairs keyname>
-- @returns: list of matching doc.pos pairs
local r = {}
for _, fv in pairs(redis.call("SMEMBERS", KEYS[1])) do
local t = redis.call("ZRANGEBYLEX", KEYS[2], "[" .. fv , "(" .. fv .. "\xff")
for _, tv in pairs(t) do
r[#r+1] = tv
end
end
return r