gpt4 book ai didi

redis - 在 Redis 中,是否可以根据某个成员在不同的 ZSET 中的存在来断言该成员包含在 ZRANGE 的结果中?

转载 作者:IT王子 更新时间:2023-10-29 06:11:25 30 4
gpt4 key购买 nike

我在 Redis 中跟踪多个 Sorted Sets 中的成员,作为对成员进行 多列 索引的一种方式。例如,假设我有两个 Sorted Sets,lastseen(即纪元时间)和 points,我将用户名作为成员存储在这些 Sorted Sets 中。

我想对 lastseen 使用 ZREVRANGEBYSCORE 来获取最近看到的用户列表,但我只希望用户包含在结果中,前提是它也出现在 >points 有序集。

我考虑过使用 ZINTERSTORE 来帮助我执行此操作,但可用的 AGGREGATE 选项不利于我的场景。如果 AGGREGATE 选项之一是使用提供给 ZINTERSTORE 命令的特定集合中的分数,那么它会起作用,但这不是一个选项。

---编辑---

例子:

redis> ZADD lastseen 12345 "foo"
redis> ZADD lastseen 12346 "bar"
redis> ZADD lastseen 12347 "sucka"
redis> ZADD points 5 "foo"
redis> ZADD points 9 "bar"

现在,如果我运行:

redis> ZREVRANGEBYSCORE lastseen +inf -inf
1) "sucka"
2) "bar"
3) "foo"

我正在寻找的是一种方法,只获取 "foo""bar" 调用 ZREVRANGEBYSCORE for lastseen 返回的方法> 因为 "sucka" 没有在 points 排序集中重新发送。

我能做到:

redis> ZINTERSTORE out 2 lastseen points
redis> ZRANGE out 0 -1 WITHSCORES
1) "foo"
2) "12350"
3) "bar"
4) "12355"

如您所见,ZINTERSTORE 确实删除了 "sucka" 成员,但其他两个成员的分数使用 SUM 进行了汇总。还有两个其他聚合选项(MIN 和 MAX)可用于 ZINTERSTORE。在这种情况下,使用 MAX 会给我我正在寻找的东西,但如果用户的点数大于最后一次看到他们的纪元值,情况就不会是这样。

最佳答案

你可以通过在运行 时将 pointsWEIGHT 设置为 0 并将 lastseen 设置为 1 来得到你想要的ZINTERSTORE 这样只考虑 lastseen 的权重:

redis> ZINTERSTORE out 2 lastseen points WEIGHTS 1 0
(integer) 2

然后,根据您想要的顺序,您可以:

redis> ZRANGE out 0 -1 WITHSCORES
1) "foo"
2) "12345"
3) "bar"
4) "12346"

或:

redis> ZREVRANGE out 0 -1 WITHSCORES
1) "bar"
2) "12346"
3) "foo"
4) "12345"

关于redis - 在 Redis 中,是否可以根据某个成员在不同的 ZSET 中的存在来断言该成员包含在 ZRANGE 的结果中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34180005/

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