Redis支持五种的数据类型,包括字符串类型(String)、列表(list)、集合(set)、有序集合(zset)、哈希(hash),下面我重点详解Redis有序集合及应用场景@mikechen
Redis有序集合定义
Redis有序集合Sorted Set,和集合set一样也是 String 类型元素的集合,且成员不允许重复,也叫ZSet。
Redis有序集合命令
Sorted Set常用命令如下:
1.zadd命令
zadd向一个有序集合中加入一个,或者多个元素及其分数,为有序集合添加新成员。
zadd语法
zadd key score member [score member ...]
zadd示例:
ZADD class1:redis 98 mikechen ZADD class1:redis 100 ada
2.zrem命令
zrem删除有序集合中指定成员。
zrem语法
ZREM key member [member ...]
zrem示例:
127.0.0.1:6379> ZREM class1:redis mikechen (integer) 1
3.zcard命令
zcard获得有序集合中的元素数量。
zcard语法
ZCARD key
zcard示例
127.0.0.1:6379> zadd myset 1 m1 2 m2 3 m3 //添加分数为1,2,3的三个成员 (integer) 3 127.0.0.1:6379> zcard myset //获取myset的成员个数,为3 (integer) 3
4.zcount命令
zcount返回集合中score值在[min,max]区间的元素数量,用于计算有序集合中指定分数区间的成员数量。
zcount语法
zcount key min max
zcount示例
127.0.0.1:6379> zadd myset 1 m1 2 m2 3 m3 //添加分数为1,2,3的三个成员 (integer) 3 127.0.0.1:6379> zcount myset 1 2//统计分数在[1,2]之间的成员个数 (integer) 2 127.0.0.1:6379> zcount myset 1 3//统计分数在[1,2]之间的成员个数 (integer) 3 127.0.0.1:6379> zcount myset 1 1//统计分数在[1,1]之间的成员个数 (integer) 1 127.0.0.1:6379>
5.zincrby命令
zincrby在集合的member分值上加increment。
zincrby语法
ZINCRBY key increment member
zincrby示例
127.0.0.1:6379> ZINCRBY class1:redis 50 tom "50" 127.0.0.1:6379> ZSCORE class1:redis tom "50"
6.zscore命令
zscore获得集合中member的分值。
zscore语法
ZSCORE key member
zscore示例
127.0.0.1:6379> ZSCORE class1:redis ada "100"
7.zrank命令
zrank获得集合中member的排名(按分值从小到大)
zrank语法
ZRANK key member
zrank示例
127.0.0.1:6379> zadd myset 1 m1 2 m2 3 m3 //添加分数为1,2,3的三个成员 (integer) 3 127.0.0.1:6379> zrank myset m1 (integer) 0 127.0.0.1:6379> zrank myset m2 (integer) 1 127.0.0.1:6379> zrank myset m3 (integer) 2
8.zrange
zrange获得集合中指定区间成员,按分数递增排序。
zrange语法
ZRANGE key start stop [WITHSCORES]
zrange示例
127.0.0.1:6379> ZRANGE class1:redis 0 -1 1) "mikechen" 2) "ada" 127.0.0.1:6379> ZRANGE class1:redis 0 -1 WITHSCORES 1) "mikechen" 2) "99" 3) "ada" 4) "100"
Redis有序集合应用场景
有序集合的使用场景与集合类似,但是set集合不是自动有序的,而sorted set可以利用分数进行成员间的排序,而且是插入时就排序好。
Redis有序集合典型的使用场景有:
1、 排行榜:有序集合经典使用场景,例如视频网站需要对用户上传的视频做排行榜,按照时间、按照播放量、按照获得的赞数等。
2、用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务,让重要的任务优先执行。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》