关灯
护眼 字体:大
中
小
上一章
章节列表
下一页
有序集合(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提示您,本章没有阅读完,点击下一页进入下一页阅读!
上一章
章节列表
下一页