BLOG
Enjoy when you can, and endure when you must.
OCT 17, 2013/数据库
学习笔记:Redis入门之数据类型 —— ZSET

ZSET,即 Sorted-Sets,和 SETS 类型相似,它们都是字符串的集合。它们之间的主要差别是 Sorted-Sets 中的每一个成员都会有一个分数(score)与之关联,Redis 正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管 Sorted-Sets 中的成员必须是唯一的,但是分数(score)却是可以重复的。

在 Sorted-Set 中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于 Sorted-Sets 中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。

ZSET 的基本操作如下:

3
>>> conn.zcard('zset-key')
3

ZSET 里的 INCR:

4.0

ZSCORE 获取分数:

2.0

ZRANK 获得所给 key 在 ZSET 中的位置:

2

ZCOUNT 统计在所给分数范围内的 key 个数:

2L

ZREM 删除指定成员:

True

返回指定 rank 范围内的元素,可选的 withscores 参数可指定是否返回分数

[('a', 3.0), ('c', 4.0)]

一些其他命令:

ZREVRANK、ZREVRANGE、ZREVRANGEBYSCORE、ZREMRANGEBYRANK、ZREMRANGEBYSCORE

ZINTERSTORE:

命令格式:

ZINTERSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

计算给定的 numkeys 个有序集合的交集,并且把结果放到 destination 中。在给定要计算的 key 和其它参数之前,必须先给定 key 个数(numberkeys)。

默认情况下,结果中一个元素的分数是有序集合中该元素分数之和,前提是该元素在这些有序集合中都存在。因为交集要求其成员必须是给定的每个有序集合中的成员,结果集中的每个元素的分数和输入的有序集合个数相等。

使用 WEIGHTS 选项,你可以为每个给定的有序集指定一个乘法因子,意思就是,每个给定有序集的所有成员的 score 值在传递给聚合函数之前都要先乘以该因子。如果 WEIGHTS 没有给定,默认就是1。

使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。默认使用的参数 SUM,可以将所有集合中某个成员的 score 值之和作为结果集中该成员的 score 值。如果使用参数 MIN 或者 MAX,结果集就是所有集合中元素最小或最大的元素。

如果 key destination 存在,就被覆盖。

redis-py 中的命令格式:

zinterstore(dest, keys, aggregate=None)

例:

3
>>> conn.zadd('zset-2', 'b', 4, 'c', 1, 'd', 0)
3
>>> conn.zinterstore('zset-i', ['zset-1', 'zset-2'])
2L
>>> conn.zrange('zset-i', 0, -1, withscores=True)
[('c', 4.0), ('b', 6.0)]

解析:

ZUNIONSTORE:

命令格式:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

计算给定的 numkeys 个有序集合的并集,并且把结果放到 destination 中。在给定要计算的 key 和其它参数之前,必须先给定 key 个数(numberkeys)。 默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和。

redis-py 中的命令格式:

zunionstore(dest, keys, aggregate=None)

例:

conn.zunionstore('zset-u', ['zset-1', 'zset-2'], aggregate='min')

解析:

COMMENTS
LEAVE COMMNT