java+redis实现排行榜排名

简述:该实例是根据springBoot整合redis来实现排行榜的效果,根据redis的sort set数据结构完成对数据的排行,
sort set的存储结构:zset.add(key,value,score);
key作为我们存储的整个大集合,value存放的就是我们的元素的名称节点,score则是我们存放的元素值。
java+redis实现排行榜排名_第1张图片
上图存储的key为:user:age,存储的value为:age1/age2....,存储的value为对应的元素值(12,52,10,30,...)

代码实现如下:
1、引入redis的依赖


       org.springframework.boot
       spring-boot-starter-redis
       1.4.6.RELEASE

2、配置文件中配置redis信息

spring:
  redis:
    password: 'root'        #密码
    database: 0             #数据库
    host: '127.0.0.1'       #地址
    port: 6379              #端口号

3、编写代码

package com.ltj.demo.Dao;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Repository;

import java.util.Set;

/**
 * 将数据存储到redis数据库中,根据用户端用户的点击次数对权重(score)值自增1
 */
@Repository
@Slf4j
public class saveInfoToRedis {

    @Autowired
    private StringRedisTemplate redisTemplate;

    public Set saveInfoToRedis(String keyWord){

        /**
         * redisTemplate.opsForZSet().reverseRank("test:zSet",keyWord)
         * 获取指定的参数排名位置(根据value值来获取),可以作为判断该数值是否已经存在的依据
         *  1、无该value则返回null,
         *  2、有则返回具体的位置排行从0开始计算
         */
        Long value = redisTemplate.opsForZSet().reverseRank("test:zSet",keyWord);
        log.info("数据存放位置(从0开始)为:{}",value);

        if(value == null){
            /**
             * redis返回null说明无该value
             * 将数据存放到redis的zset数据结构中,
             * 存储格式为(key:"test:zSet",value:keyWord,score:"权重")
             */
            Boolean result = redisTemplate.opsForZSet().add("test:zSet",keyWord,30);
            log.info("存储结果为:{}",result);
        }else{
            /**
             * redis中存在该value值
             * redisTemplate.opsForZSet().incrementScore("test:zSet",keyWord,1);
             * 数据存在的情况下对value的权重自增1
             */
            Double resultValue = redisTemplate.opsForZSet().incrementScore("test:zSet",keyWord,Double.valueOf(1));
            log.info("当前权重值为:{}",resultValue);
        }

        /**
         * 获取redis中存储的数值
         * 存储的权重值为0-100的数值,降序排序
         */
        Set sets =  redisTemplate.opsForZSet().reverseRangeByScore("test:zSet",0,100);
        log.info("0-100的权重从降序排序集合{}",sets);


        /**
         * redisTemplate.opsForZSet().reverseRange("test:zSet",0,2);
         * 根据排名返回数据从0开始计算,不返回权重
         * 返回前三条数据
         */
        Set redisValue = redisTemplate.opsForZSet().reverseRange("test:zSet",0,2);
        for (String set: redisValue) {
            log.info("返回的数据有:{}",set);
        }

        /**
         * 返回前四条热词的参数值,并返回权重值
         *  redisTemplate.opsForZSet().reverseRangeWithScores("test:zSet", 0, 3);
         */
        Set> redisValues = redisTemplate.opsForZSet().reverseRangeWithScores("test:zSet", 0, 10);
        log.info("返回的集合为:{}",redisValue);
        for (ZSetOperations.TypedTuple set: redisValues) {
            log.info("数据返回的value为:{},权重(score)为:{}",set.getValue(),set.getScore());
        }

        return sets;
    }
}

4、编写测试类

package com.ltj.demo.Dao;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Set;

import static org.junit.Assert.*;

/**
 * 测试类
 */
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class saveInfoToRedisTest {

    @Autowired
    private saveInfoToRedis saveInfoToRedis;

    @Test
    public void saveInfoToRedis() {
        //调用方法
        Set sets = saveInfoToRedis.saveInfoToRedis("luo");

        log.info("0-100的权重从降序排序集合{}",sets);
    }
}

测试结果

2019-09-22 18:47:07.529  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 数据存放位置(从0开始)为:1
2019-09-22 18:47:08.013  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 当前权重值为:32.0
2019-09-22 18:47:08.833  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 0-100的权重从降序排序集合[you, luo, tong, jie, i, love]
2019-09-22 18:47:09.439  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 返回的数据有:你
2019-09-22 18:47:09.440  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 返回的数据有:luo
2019-09-22 18:47:09.440  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 返回的数据有:tong
2019-09-22 18:47:09.966  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 返回的集合为:[you, luo, tong]
2019-09-22 18:47:09.967  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 数据返回的value为:你,权重(score)为:50.0
2019-09-22 18:47:09.967  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 数据返回的value为:luo,权重(score)为:32.0
2019-09-22 18:47:09.967  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 数据返回的value为:tong,权重(score)为:25.0
2019-09-22 18:47:09.967  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 数据返回的value为:jie,权重(score)为:10.0
2019-09-22 18:47:09.967  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 数据返回的value为:i,权重(score)为:10.0
2019-09-22 18:47:09.967  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedis         : 数据返回的value为:love,权重(score)为:9.0
2019-09-22 18:47:09.967  INFO 73924 --- [           main] com.ltj.demo.Dao.saveInfoToRedisTest     : 0-100的权重从降序排序集合[you, luo, tong, jie, i, love]


有问题可以直接+QQ一起探讨+949379865

你可能感兴趣的:(redis,java)