在实际生活中,排行榜的例子随处可见,如考试成绩排名、商品销售排名、游戏等价或积分排名,以及热门文章或帖子的点赞数、访问量等相关的排名等。要实现一个排行榜功能,可以利用 Redis 有序集合(Sorted Set)类型中的相关命令。
【实例】使用 Redis 的有序集合(Sorted Set)命令,根据博客积分进行排名,以及按照条件筛选博客。
(1)在pom.xml配置信息文件中,添加Redis启动器、Jedis客户端的相关依赖:
<!-- Redis启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.0</version>
</dependency>
<!-- Jedis客户端依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
(2)排行榜实现(RankingList.java):
package com.pjb.ranking;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* Redis实现排行榜
* 实现博客积分排名
* @author pan_junbiao
**/
public class RankingList
{
static int TOTAL_SIZE = 10; //用户总人数
public static void main(String[] args)
{
//创建Jedis实例
Jedis jedis = new Jedis("127.0.0.1",6379);
System.out.println("Redis连接成功");
try
{
//Redis键
String key = "BLOG_KEY";
//清理可能已有的键
jedis.del(key);
//模拟生成多个博主
List<String> bloggers = new ArrayList<>();
for(int i=1; i<=TOTAL_SIZE; i++)
{
bloggers.add("pan_junbiao的博客_" + i);
}
//记录每个博主的积分
for(int j=0; j<bloggers.size(); j++)
{
//模拟生成博主的博客积分
int score = (int) (Math.random() * 10000);
String blogger = bloggers.get(j);
//打印博主的博客积分信息
System.out.println("博客ID:" + blogger + ",博客积分:" + score);
//将博主信息与博客积分保存到Redis中
jedis.zadd(key, score, blogger);
}
//打印全部博客的积分排行榜
System.out.println();
System.out.println("-----------全部博客排行榜-----------");
Set<Tuple> scoreList = jedis.zrevrangeWithScores(key,0,-1);
for(Tuple item : scoreList)
{
System.out.println("博客ID:" + item.getElement() + ",博客积分:" + item.getScore());
}
//打印排名前五名的博客
System.out.println();
System.out.println("-----------排名前五名的博客排行榜-----------");
scoreList = jedis.zrevrangeWithScores(key,0,4);
for(Tuple item : scoreList)
{
System.out.println("博客ID:" + item.getElement() + ",博客积分:" + item.getScore());
}
//打印积分在5000至8000分之间的博客
System.out.println();
System.out.println("-----------积分在5000至8000分之间的博客-----------");
scoreList = jedis.zrangeByScoreWithScores(key,5000,8000);
for(Tuple item : scoreList)
{
System.out.println("博客ID:" + item.getElement() + ",博客积分:" + item.getScore());
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
jedis.quit();
jedis.close();
}
}
}
执行结果: