利用Redis Sorted Set实现排行榜功能

Redis 有序集合(sorted set)

一、向集合中添加(多个)元素和元素分值

ZADD key score1 member1 [ score2 member2]

1. ZADD runoobkey 1 redis
2. ZADD runoobkey 2 mysql 3 java

二、遍历集合

ZRANGE XXX 0 -1 WITHSCORES

三、 获取有序集合的成员数

zcard key

zcard  runoobkey

四、 对集合中元素进行加减

Redis Zincrby 命令对有序集合中指定成员的分数加上增量 increment

1. 可以通过传递一个负数值 increment ,让分数减去相应的值,比如 ZINCRBY key -5 member ,
就是让 member 的 score 值减去 5 。

2. 当 key 不存在,或分数不是 key 的成员时, ZINCRBY key increment member
等同于 ZADD key increment member 。

3. 当 key 不是有序集类型时,返回一个错误。
4. 分数值可以是整数值或双精度浮点数。
ZADD myzset 1 "one"
ZADD myzset 2 "two"
ZINCRBY myzset 2 "one"
ZRANGE myzset 0 -1 WITHSCORES
发现one变成了3

五、返回有序集合中指定成员的索引

ZRANK Jihe  member

其中有序集成员按分数值递增(从小到大)顺序排列。

也就是说数值越大,返回的索引越大

red:0> ZADD runoobkey 1 redis
“1”

red:0>ZADD runoobkey 2 mysql 3 java
“2”

red:0>ZADD runoobkey 2 mongo 3 tomcat
“2”

red:0>ZADD runoobkey 2 mongoDB 4 ap

ap 4 tomcat java 3 mongoDB mongo mysql 2 redis 1

六、按照索引递增递减排序

递增:
red:0> ZRANGE runoobkey  0 -1 WITHSCORES    
 1)  "aa"
 2)  "0"
 3)  "dd"
 4)  "0"
 5)  "redis"
 6)  "1"
 7)  "mongo"
 8)  "2"
 9)  "mongoDB"
 10)  "2"
 11)  "mysql"
 12)  "2"
 13)  "java"
 14)  "3"
 15)  "tomcat"
 16)  "3"
 17)  "ap"
 18)  "4"

//递减
red:0>ZREVRANGE  runoobkey 0 -1 WITHSCORES    
 1)  "ap"
 2)  "4"
 3)  "tomcat"
 4)  "3"
 5)  "java"
 6)  "3"
 7)  "mysql"
 8)  "2"
 9)  "mongoDB"
 10)  "2"
 11)  "mongo"
 12)  "2"
 13)  "redis"
 14)  "1"
 15)  "dd"
 16)  "0"
 17)  "aa"
 18)  "0"

ZREVRANGEBYSCORE salary +inf -inf   # 逆序排列所有成员

red:0>ZREVRANGEBYSCORE runoobkey  +inf -inf
 1)  "ap"
 2)  "tomcat"
 3)  "java"
 4)  "mysql"
 5)  "mongoDB"
 6)  "mongo"
 7)  "redis"
 8)  "dd"
 9)  "aa"
ZREVRANGEBYSCORE salary 10000 2000  # 逆序排列薪水介于 10000 和 2000 之间的成员

七、返回一个key在集合中的分数

 ZSCORE key member

看完上面的sorted SET,我们试着实现一下点赞功能

7.1 单个用户点赞数实现
每当一个用户给它点赞,记录用户的ID
ZINCRBY wenZhangID  1 userID
取消赞
ZINCRBY wenZhangID -1 userID
当然这里有一个逻辑,一个用户只能点赞并取消
如果要统计一个用户的这篇文章被点赞了多少次,可以直接取里面有多少个成员就可以了
zcard wenZhangID
7.2 点赞排行设计与实现
其实就是再新建一个集合A,里面就存用户ID和点赞数
每当单个用户的点赞数发生变化的时候,同步更新A里面的个人点赞数
然后实时计算top就可以了,比如top100
ZREVRANGE  runoobkey 0 99 WITHSCORES   

你可能感兴趣的:(redis)