文档章节

redis-实现排行榜

J
 Jackyang123
发布于 2015/12/08 18:23
字数 498
阅读 334
收藏 1

使用redis的有序集合zset实现排行榜功能,步骤有:

1、下载jedis-2.7.2.jar

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.2</version>
    <type>jar</type>
    <scope>compile</scope> 
</dependency>

2、下载jackson所需的jar包

使用jackson实现数据的序列化和反序列化

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.5.4</version>
</dependency>

3、初始化JedisPool对象,并通过JedisPool创建Jedis对象

public class JedisHandler {
    private static JedisPool jedisPool = null;

    static {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(8); // maximum active connections
        poolConfig.setMaxIdle(100);  // maximum idle connections
        jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
    }
	
    public static Jedis createJedis() {
        return jedisPool.getResource();
    }
}

4、创建数据模型对象

public class User {

    private String id;

    private String userName;
	
    private Integer gender;
	
    private String redisterDate;
	
    private Double score;

    /** 排名 */
    private Integer rank;
	...
	...
	...
}

5、通过jedis添加模拟数据

public static void setData() {
    Jedis jedis = JedisHandler.createJedis();
    User user = new User("100", "汤姆", 1, "2012-10-20");
    jedis.zadd("user:score", 1000d,  MarshalJSONUtil.marshalBeanToJson(user));
		
    user = new User("101", "韩梅梅", 2, "2013-03-10");
    jedis.zadd("user:score", 873.3,  MarshalJSONUtil.marshalBeanToJson(user));
		
    user = new User("102", "Jack", 1, "2008-11-10");
    jedis.zadd("user:score", 1302.6d,  MarshalJSONUtil.marshalBeanToJson(user));
		
    user = new User("103", "Rose", 2, "2015-02-03");
    jedis.zadd("user:score", 200d,  MarshalJSONUtil.marshalBeanToJson(user));
		
    user = new User("104", "李雷", 1, "2014-01-26");
    jedis.zadd("user:info", 534.73d, MarshalJSONUtil.marshalBeanToJson(user));
		
    Random random = new Random();
    for(int i = 1; i < 101; i++) {
        int index = 104 + i;
        user = new User(index + "", "用户" + index, random.nextInt(1) + 1, "2015-01-26");
        jedis.zadd("user:score", 100d + 1, MarshalJSONUtil.marshalBeanToJson(user));
    }
    jedis.close();
}

6、通过jedis排序,筛选数据

/**
    * 获取降序排列的数据
    * @return 排名后的用户集合
*/
public static List<User> getRevRankData(int count) {
    Jedis jedis = JedisHandler.createJedis();
    List<User> list = new ArrayList<User>();
    try {
        Set<Tuple> set = jedis.zrevrangeWithScores("user:score", 0, count);
        Iterator<Tuple> iterator = set.iterator();
	int rank = 1;
	while(iterator.hasNext()) {
	    Tuple tuple = iterator.next();
	    String userInfo = tuple.getElement();
            User user = MarshalJSONUtil.marshalToBean(userInfo, User.class);
            user.setScore(tuple.getScore());
            user.setRank(rank++);
            list.add(user);
        }
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        jedis.close();
    }
    return list;
}

7、创建处理请求的Servlet

public class RankServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String type = request.getParameter("type");
        String countStr = request.getParameter("count");
        int count = (countStr == null || "".equals(countStr)) ? -1 : Integer.parseInt(countStr);
        List<User> list = null;
        if("asc".equalsIgnoreCase(type)) {
            list = RankUtil.getRankData(count);
        } else {
            list = RankUtil.getRevRankData(count);
        }
        request.setAttribute("list", list);
        request.getRequestDispatcher("/rank.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        doGet(request, response);
    }
}


© 著作权归作者所有

J
粉丝 7
博文 34
码字总数 28805
作品 0
深圳
其他
私信 提问
使用redis设计一个排行榜

公司的app里面需要加一个排行榜的功能,做完之后,分享给大家 思路 入口MQ----------操作Redis-----------同步mysql 实现方式 使用了redis的排行榜的功能 这样一个排行榜就设计完成了....

H_Man
2018/01/24
0
0
SpringBoot应用篇之借助Redis实现排行榜功能

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 在一些游戏和活动中,当涉及到社交元素的时候,排行榜可以说是一个很常见的需求场景了,就我们通常见到的排行榜而言,会提供以下基本功能 ...

小灰灰Blog
2018/12/25
362
0
Redis 的 8 大应用场景!

之前讲过Redis的介绍,及使用Redis带来的优势,这章整理了一下Redis的应用场景,也是非常重要的,学不学得好,能正常落地是关键。 下面一一来分析下Redis的应用场景都有哪些。 1、缓存 缓存现...

Java技术栈
2018/08/29
161
0
使用 Redis 实现排行榜功能

排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。 一般排行榜都是有实效性的,比如“用户积分榜”。如果没有实效性一直按照总榜来排,可能榜首总是...

Mr_Jing
09/29
0
0
Redis能干啥?细看11种Web应用场景

Redis的一个很大好处就是可以不用整个转入到这个数据库,而是可以沿用之前的MySQL等数据库,而仅在一些特定的应用场景通过Redis的特性提高效率。本文列出了11个这样的Web应用场景,如显示最新...

mickelfeng
2013/02/03
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
40分钟前
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
8
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
78
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部