gpt4 book ai didi

redis - 如何获取与全局 key 不匹配的Redis集的元素?

转载 作者:行者123 更新时间:2023-12-03 06:42:40 26 4
gpt4 key购买 nike

如何获得所有没有相应全局哈希的键?

我将主数据存储在具有唯一键的哈希中,如下所示:

person_1: name: Anna, gender: female
person_2: name: Mark, gender: male
person_3: name: Pat, gender: female
person_4: name: Jo, gender: female
person_5: name: Robert, gender: male

假设我以SET的形式维护所有男性的索引,如下所示:
male_persons: 2, 5, 6

如您所见,由于没有person_6,因此我陷入了“错误”。进行SORT时,我可以轻松建立一个“关系查询”,让我所有的男性:
SORT "male_persons" BY nosort GET # GET "person_*->name"

预期的输出是这样的:
"2", "Mark",
"5", "Robert",
"6", nil

我的问题是,如何才能只对没有对应人的SET键进行1或2个查询,即在上面的示例中如何仅生成此行:
"6", nil

甚至更好:
"6"

要么:
person_6

在SQL中,这类似于:
SELECT id FROM male_person_index WHERE male_person_index.id NOT IN (SELECT person.id FROM person);

我知道这样做的一种方法是编写一个Lua脚本,但这似乎很基础,应该可以在1或2个标准查询中完成,而我只是想念它。在这种特殊情况下,性能并不是至关重要的,因此一个接一个发出1个或2个甚至3个标准查询就足够了。

更新:我以Lua脚本的形式编写了一个解决方案,但如前所述,我对此不满意:
eval 'local out = {}; local i = 1; local exists; for _, key in ipairs(redis.call("SMEMBERS", KEYS[1])) do exists = redis.call("EXISTS", "persons_" .. key); if exists == 0 then out[i] = key .. " -> " .. exists; i = i + 1; end; end; return out;' 1 "male_persons"

我不满意的原因是这是“循环”且缓慢,可能会调用 EXISTS数千次或数百万次。我仍然认为应该在2或3笔交易中完成交易,而不是1000笔或数百万笔交易。

一个不错的解决方案是采用 SORT命令的输出数组,对其进行 STORE,然后以某种方式从该结果中减去另一个查询结果数组,以通过未孤立的键来减少最终输出,从而使我在最后,仅孤立键。

那可能吗?

最佳答案

您可以尝试以下非常棘手的方法:

蜂胶

  • 使用您的排序解决方案,并将结果存储在列表中:list1。
    SORT "male_persons" BY nosort GET # GET "person_*->name" store list1
  • 按字典名的顺序按person _ *-> name排序male_persons(即ALPHA选项),并将结果存储到列表中:list2:
    SORT "male_persons" BY person_*->name ALPHA GET # GET "person_*->name" store list2
  • 删除list1中的所有空字符串,并获取删除的元素数:num:
    num = LREM list1 0 ""
  • 从list2中获取第一个num * 2元素:
    LRANGE list2 0 (num * 2 - 1)

  • 说明:
  • 通过按字典顺序对数据进行排序(即步骤2),我们可以确保不存在的成员位于结果列表(即list2)的前面,并且对应的值为空字符串:
  • 127.0.0.1:6379> lrange list2 0 -1
    1) "6"
    2) ""
    3) "2"
    4) "Mark"
    5) "5"
    6) "Robert"
  • 我们可以从list1中删除所有空字符串,即第1步和第3步,以便获得散列中不存在的成员数。

  • 注意:为了节省成本,我们不会在步骤1中进行排序。
    127.0.0.1:6379> lrem list1 0 ""
    (integer) 1
  • 然后结果为list2中的第一个num * 2元素,即步骤4:
  • 127.0.0.1:6379> lrange list2 0 1
    1) "6"
    2) ""

    关于redis - 如何获取与全局 key 不匹配的Redis集的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60346709/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com