如何在排序集上获取DIFF

exe*_*ook 7 redis

如何从排序集中获取大多数加权元素,但不包括在另一个集合(或列表或散列)中找到的元素.

>zadd all 1 one
>zadd all 2 two
>zadd all 3 three
>sadd disabled 2
>sdiff all disabled

(error) WRONGTYPE Operation against a key holding the wrong kind of value
Run Code Online (Sandbox Code Playgroud)

我唯一的选择是从排序集中逐个获取元素并与"禁用"项列表进行比较吗?由于对服务器的这么多交易,这不是很慢吗?

这是什么方法?

Ita*_*ber 25

注意:我认为你的意思是 sadd disabled two

正如您所知,SDIFF不对有序集合进行操作 - 这是因为定义有序集合之间的差异并非易事.

您可以做的是首先使用ZUNIONSTORE创建一个临时集并将交叉点的分数设置为0.然后执行不包括0的范围,例如:

127.0.0.1:6379> ZADD all 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> SADD disabled two
(integer) 1
127.0.0.1:6379> ZUNIONSTORE tmp 2 all disabled WEIGHTS 1 0 AGGREGATE MIN
(integer) 3
127.0.0.1:6379> ZREVRANGEBYSCORE tmp +inf 1 WITHSCORES
1) "three"
2) "3"
3) "one"
4) "1"
Run Code Online (Sandbox Code Playgroud)