Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 如何根据Redis中的另一个集合按其concat值过滤任何集合_Lua_Redis - Fatal编程技术网

Lua 如何根据Redis中的另一个集合按其concat值过滤任何集合

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) ... 我根据用户的选择创建了另

我在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)
...
我根据用户的选择创建了另一个实时redis集 它包含选定的文档

smembers filteredDocs
我想根据用户文档id选择过滤doc.pos“在文档中键入”设置。 事实上,如果我不在集合中使用concat值,那么使用烧结矿就很容易了

因此,我实现了一个php过滤器代码,如下所示。 它可以工作,但需要优化。 在大医生对设置太多的时间需要。(接近15万会员!)

我尝试将分数作为docId进行排序。 Bu找不到分数值的相交或筛选选项

我正在考虑并搜索一个基于Redis的解决方案,该解决方案具有支持的键、集或Lua脚本,用于时间优化。 但什么也找不到

如何使用concat值过滤Redis集


感谢您的帮助。

您的代码运行缓慢,主要是因为您正在将大量数据从Redis移动到PHP过滤器。这里的一般动机应该是在服务器上执行尽可能多的过滤。要做到这一点,您需要在CPU和RAM方面付出一定的代价

有很多方法可以做到这一点,这里有一个:

  • 确保您使用的是Redis v2.8.9或更高版本
  • 为了只允许有效地查找
    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