简述:该实例是根据springBoot整合redis来实现排行榜的效果,根据redis的sort set数据结构完成对数据的排行,
sort set的存储结构:zset.add(key,value,score);
key作为我们存储的整个大集合,value存放的就是我们的元素的名称节点,score则是我们存放的元素值。
上图存储的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