Redis学习_2_数据类型_5_sorted_set
sorted_set介绍与基本操作
关于sorted_set
sorted_set产生的原因:需要一种新的存储结构,来保存可以按一定规则排序的数据。
sorted_set的实现:在set的基础上,加一个用于排序的字段,这个字段可以是整数也可以是小数:
基本操作
- 添加数据:
zadd key score1 member1 [score2 member2 ...]
,如zadd stu 64 tom 86 jam
。 - 获取全部数据(score从小到大排序):
zrange key start stop [withscores]
,如zrange stu 0 -1 withscores
,这个就是查stu这个数据结构中的所有数据,0为起始位置,-1为最后一个,[withscores]这个参数代表的就是是否显示score字段。 - 获取全部数据(score从大到小排序):
zrevrange key start stop [withscores]
,如zrevrange stu 0 -1 withscores
,这个和上一个仅仅是排序顺序相反。 - 删除数据:
zrem member1 [member2 ...]
,如zrem stu jam
。 - 按条件获取数据(从小到大):
zrangebyscore key min max [withscores] [limit offset count]
,如zrangebyscore stu 60 100 withscore limit 2 2
,代表取stu里60到100的数据,且用limit限制数量:从下标’offset’开始,取’count’个。 - 按条件获取数据(从大到小):
zrevrangebyscore key max min [withscores] [limit offset count]
,如zrevrangebyscore stu 100 60 withscores limit 1 2
,除了顺序和上一个命令相反,其他都一样。 - 根据索引删除数据:
zremrangebyrank key start stop
,如zremrangebyrank stu 0 2
,删除下标为0到2的数据。 - 根据score删除数据:
zremrangebyscore key min max
,如zremrangebyscore stu 40 60
,删除40-60这个范围的数据。 - 获取集合数据总量:
zcard key
,如zcard stu
。 - 获取指定范围内的数量:
zcount key min max
,如zcount stu 80 100
。 - 集合取交集:
zinterstore destination numkeys key [key ...] [weights weight] [aggregate sum|min|max]
,如zinterstore stu 3 stu1 stu2 stu3
,操作完后可以看一下stu里面的数据,这个是把这几个集合中相交的部分的score都加起来了,如果不要相加,要最大值、最小值也可以,就用aggregate参数。 - 集合取并集:
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
,如zunionstore stu 3 stu1 stu2 stu3
,这个和上一条命令相似,不再详细记录。
sorted_set扩展操作
- 取数据的索引(从小到大):
zrank key member
,如zrank stu jam
。 - 取数据的索引(从大到小):
zrevrank key member
,如zrevrank stu jam
。 - 获取score字段的值:
zscore key member
,如zscore stu jam
。 - 修改score字段的值:
zincrby key increment member
,如zincrby stu 20 jam
。
sorted_set注意事项
- score的存储空间是64位。
- score可以存小数,精度位double的精度,不是十分准确,使用要慎重。
- sorted_set的底层还是set,因此数据不能重复,如果重复写入,score保存的是最后一次的数据。
sorted_set的应用
-
排行榜的实现
根据对score字段的操作,我们可以对排名依据的数据做控制,同时又可以依靠sorted_set的排序功能实现排行。 -
实现时效性任务管理
举个日常的例子,我们开B站大会员,勾选了自动续费,这么多人,怎么就知道今天谁谁谁大会员要到期了,谁谁谁要自动续费呢,可以用sorted_set,我们在score字段存到期日或者自动续费日,每天刷新一次数据,如果今天有到期的或者要续费的,就从sorted_set里取出来,提醒他到期或者自动续费,如果是自动续费,修改score后重新存入sorted_set。 -
带有权重的任务管理
对于商家来说,可能有的客户出手阔绰,一掷千金,那商家肯定要优先服务这个大金主爸爸,其他一般的客户稍稍往后排,这个就体现出各个客户的优先级,也就是权重不一样,至于怎么体现这个权重呢,还是根据sorted_set的排序功能,可以倒着排序,权重越大的客户在最前面,从而享受更优质的服务。