如何从排序集中获取大多数加权元素,但不包括在另一个集合(或列表或散列)中找到的元素。
>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
我唯一的选择是逐个从排序集中获取元素并与“禁用”项列表进行比较吗?由于对服务器的这么多交易,这不是很慢吗?
这里的方法是什么?
答案 0 :(得分:24)
注意:我认为你的意思是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"