redis 简单整理——redis 的有序集合基本结构和命令[六]

Posted 程序员其实就是一个写文档的工作,代码只是文档的一部分,一切皆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 简单整理——redis 的有序集合基本结构和命令[六]相关的知识,希望对你有一定的参考价值。

前言

简单介绍一下redis的有序集合的基本结构和命令。

正文

有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序 集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性, 但不同的是,有序集合中的元素可以排序。

但是它和列表使用索引下标作为 排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依 据。

有序集合包含kris、mike、frank、tim、martin、tom, 它们的分数分别是1、91、200、220、250、251,有序集合提供了获取指定 分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助 我们在实际开发中解决很多问题。

注意:

有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。

那么下面就来介绍其中的命令吧。

zadd key score member [score member ...]

注意点:

·Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:

 ·nx:member必须不存在,才可以设置成功,用于添加。

 ·xx:member必须存在,才可以设置成功,用于更新。 

 ·ch:返回此次操作后,有序集合元素和分数发生变化的个数

 ·incr:对score做增加,相当于后面介绍的zincrby

性能:

有序集合相比集合提供了排序字段,但是也产生了代价,zadd的时间 复杂度为O(log(n)),sadd的时间复杂度为O(1)。

zcard key 计算成员个数:

zscore 获取某个成员的权重:

如果不存在返回为空:

zrank 表示从低到高排序,从0开始的:

zrevrank 表示从高到底排序,从0开始的:

zrem key member 删除某个成员:

给某个值增加权重:

返回指定排名的成员:

如果加上withscores 还会返回分数:

zrevrange 自然就是从高到底排序,然后取出部分。

zrangebyscore key min max [withscores] [limit offset count] 

zrevrangebyscore key max min [withscores] [limit offset count]

上面返回指定分数范围。

返回指定范围个数:

zcount key min max

删除指定排名内的升序元素:

zremrangebyrank key start end

删除指定分数范围的成员:

zremrangebyscore key min max

下面就是集合范围相关的东西了:
交集

zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
这个命令参数较多,下面分别进行说明: ·destination:交集计算结果保存到这个键。 
·numkeys:需要做交集计算键的个数。 ·key[key...]:需要做交集计算的键。139
·weights weight[weight...]:每个键的权重,在做交集计算时,每个键中 的每个member会将自己分数乘以这个权重,每个键的权重默认是1
。 ·aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、 min(最小值)、max(最大值)做汇总,默认值是sum。

并集:

zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

复杂度:

内部编码

·ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。

 ·skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作 为内部实现,因为此时ziplist的读写效率会下降。

使用场景

有序集合比较典型的使用场景就是排行榜系统。

下面用点赞数排行作为例子:

1.例如用户mike上传了一个视频,并获得了3个赞,可以使用有序集合的 zadd和zincrby功能

zadd user:ranking:2016_03_15 mike 3

如果之后再获得一个赞,可以使用zincrby:

zincrby user:ranking:2016_03_15 mike 1

2.由于各种原因(例如用户注销、用户作弊)需要将用户删除,此时需要 将用户从榜单中删除掉,可以使用zrem。例如删除成员tom:

zrem user:ranking:2016_03_15 mike

3.展示获取赞数最多的十个用户 此功能使用zrevrange命令实现:

zrevrangebyrank user:ranking:2016_03_15 0 9
  1. 此功能将用户名作为键后缀,将用户信息保存在哈希类型中,至于用户 的分数和排名可以使用zscore和zrank两个功能:
hgetall user:info:mike
zscore user:ranking:2016_03_15 mike
zrank user:ranking:2016_03_15 mike

下一节,键管理。

以上是关于redis 简单整理——redis 的有序集合基本结构和命令[六]的主要内容,如果未能解决你的问题,请参考以下文章

通过redis的有序集合[zset] 实现延迟队列

Redis数据操作之有序集合 | Redis

Redis基本操作进阶篇学习--排序

Redis基本数据类型常用操作

Redis之基本数据类型

面试官:Redis中有序集合的内部实现方式是什么?