首页

9.3有序集合

关灯 护眼    字体:

上一章 章节列表 下一页


有序集合(Sorted Set)是Redis的一个数据结构。

有序集合里面的数据跟集合一样,也是不能重复的,但是每一个元素又关联了一个分数(Score),根据这个分数可以对元素进行排序。分数可以重复。



9.3.1 实例39:实现排行榜功能


各种排行榜是我们司空见惯的功能。各位读者是否思考过,各种排行榜是如何实现的呢?

实例描述

分别使用MongoDB和Redis的有序集合来实现排行榜功能。对比传统数据库的排序功能,寻找有序集合实现排序功能的优点。

1.使用传统数据库实现排行榜

这里以 MongoDB 为例来进行说明。这种方法的逻辑非常直接,需要被排名的信息都保存在数据库里面,当需要显示排行榜时,直接读取数据库,然后对结果进行排名。

(1)运行rank_data_to_mongo.py生成测试数据,如图9-15所示。测试数据的user_id对应于用户的id,score对应于用户的积分。

图9-15 测试数据

(2)根据积分对用户进行排序。代码如下:

代码9-15 使用MongoDB对用户积分排序

(3)运行效果如图9-16所示。

图9-16 直接使用MongoDB进行排序

2.使用数据库排序的弊端

具体到一个实际例子,比如说直播网站观众向主播送礼物的排行版,如果直接在数据库里面进行排序,弊端有以下几点:

● 排行榜会实时更新,数据每一次变化都要排序,会对数据库的性能造成影响。

● 频繁更新数据,导致数据库性能下降。

● 数据量太大时排序时间缓慢。

● 对被排序字段添加索引会占用更多空间。

3.使用有序集合进行排序

Redis的有序集合天生就自带排序的功能。

(1)直接把MongoDB中的数据导入到Redis中名为“rank”的有序集合中:

代码9-16 使用有序集合排序



(2)显示某一个特定用户的排名,具体代码如下:

代码9-17 显示特定排名的用户

(3)显示全部用户的排名,具体代码如下:

rank = client.zrevrank('rank', 0, 10000, withscores=True)

(4)运行效果如图9-17所示。

图9-17 排名查询

有序集合还能直接修改某一个值的分数,从而直接改变排序。



9.3.2 实例40:使用Python读写有序集合


有序集合的操作命令有二十多个,对应到Python中也有二十多个方法。本书选择其中常用的几个。

实例描述

在Python中控制Redis,读写有序集合,实现以下功能:

(1)把数据添加到有序集合中。

(2)修改有序集合值的评分。

(3)将有序集合基于“评分”进行排序。

(4)将有序集合基于“位置”进行排序。

(5)根据值查询排名和评分情况。

1.向有序集合添加数据

向有序集合添加数据,使用的方法为“zadd”。它的格式有两种:

方法一:client.zadd(’有序集合名’, 值1, 评分1, 值2, 评分2, 值n, 评分n)

方法二:client.zadd(’有序集合’, 值1=评分1, 值2=评分2, 值3=评分3)

这两种方式的效果是一样的,但是第1种的值可以使用变量,而第2种的值不能使用变量。

例如,代码9-18是一个和年龄相关的有序集合。

代码9-18 使用Python向Redis有序集合中添加数据

其中,主要代码说明如下。

● 第4行代码:其中的name1和name2是变量,它们里面的值分别为“王小二”和“张三”。最后存在Redis中的值也是“王小二”和“张三”。

● 第5行代码:使用Value=score的写法,用这种写法时,Value不能使用变量,只能直接写值。

第4行和第5行效果完全一样。

2.修改评分

修改评分使用的方法名为“zincrby”,格式如下:

client.zincrby(’有序集合名’, 值,改变量)

例如,在age_rank中,把“王小二”的年龄增加三岁,把“小明”的年龄减0.5岁:

代码9-19 修改有序集合的元素评分

3.对有序集合元素基于评分范围进行排序

根据评分范围进行排序,使用的方法分别为“zrangebyscore”和“zrevrangebyscore”。

这两个方法的用法完全相同,差别在于:

● zrangebyscore根据评分按照从小到大的顺序排序。

● zrevrangebyscore根据评分按照从大到小的顺序排序。

它们的使用格式如下:

client.zrangebyscore(’有序集合名’, 评分上限, 评分下限, 结果切片起始位置, 结果数量, withscores=False)

client.zrevrangebyscore(’有序集合名’, 评分上限, 评分下限, 结果切片起始位置, 结果数量, withscores=False)

其中,评分上限、评分下限用于确定排序的范围。例如,评分分布在0~10000,现在只对评分在10~100范围内的值进行排序。排序完成以后,通过设定结果切片的起始位置、结果数量来限定返回的列表的长度。其中,结果切片起始位置、结果数量这两个参数可以同时省略,省略表示返回排序后的所有数据。m.qiduwx.com提示您,本章没有阅读完,点击下一页进入下一页阅读!

上一章 章节列表 下一页