关于Spring Boot与Redis的整合,在前一篇已经介绍过了,这里就不再累述了。本篇是在上一篇的基础上实现的,若有疑问,请移步https://www.jianshu.com/p/cc27fc09d06a。
1.在RedisUtil里面添加Sorted Set的相关方法
/**
* 有序集合添加之前没有的元素
*/
public boolean zAdd(String key,Object value,double score) {
return redisTemplate.opsForZSet().add(key, value,score);
}
/**
* 获取集合中元素的排名(从大到小排序)
* @param key
* @param value
* @return
*/
public long zGetRank(String key,Object value) {
return redisTemplate.opsForZSet().reverseRank(key, value);
}
/**
* 若集合中已有此元素,则此元素score+传入参数
* 若没有此元素,则创建元素。
* @param key
* @param value
* @param score
*/
public void zIncreamentScore(String key,Object value,double score) {
redisTemplate.opsForZSet().incrementScore(key, value, score);
}
/**
* 对集合按照分数从小到大排序(默认)
* 指定位置区间0,-1指排序所有元素
* 得到的值带有score
* @param key
* @return
*/
public Set<TypedTuple<Object>> zRangeWithScore(String key) {
return redisTemplate.opsForZSet().rangeWithScores(key, 0, -1);
}
/**
* 对集合按照分数从大到小排序
* @param key
* @return
*/
public Set<TypedTuple<Object>> zReverseRangeWithScore(String key){
return redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, -1);
}
/**
* 获取有序集合的大小
* @param key
* @return
*/
public Long zGetSize(String key) {
return redisTemplate.opsForZSet().size(key);
}
/**
* 获取key集合里面,value值的分数
* @param key
* @param value
* @return
*/
public double zGetScoreByValue(String key,Object value) {
return redisTemplate.opsForZSet().score(key, value);
}
/**
* 指定分数区间,从大到小排序
* @param key
* @param start
* @param end
* @return
*/
public Set<TypedTuple<Object>> zReverseRangeByScoreWithScores(String key,double start,double end){
return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, start, end);
}
2.RankService添加实现排行榜的接口
package com.ljessie.redisdemo.service;
import java.util.Set;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
public interface RankService {
boolean zAdd(String value,double score);
void zIncreamentScore(String value,double score);
long zGetRank(String value);
double zGetScore(String value);
Set<TypedTuple<Object>> rankWithScore();
}
3.RankServiceImpl实现service的接口
package com.ljessie.redisdemo.service.impl;
import java.util.Set;
import javax.annotation.Resource;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
import org.springframework.stereotype.Service;
import com.ljessie.redisdemo.service.RankService;
import com.ljessie.redisdemo.utils.RedisUtil;
@Service
public class RankServiceImpl implements RankService{
@Resource
RedisUtil redisUtil;
public static final String key = "USER_SCORE_RANK";
/**
* 向排行榜里面添加数据,value是用户信息,demo里面村的是user_id,socre是用户的分数
*/
@Override
public boolean zAdd(String value, double score) {
return redisUtil.zAdd(key, value, score);
}
/**
* 增加用户的积分
*/
@Override
public void zIncreamentScore(String value, double score) {
redisUtil.zIncreamentScore(key, value, score);
}
/**
* 获取用户的排名
*/
@Override
public long zGetRank(String value) {
return redisUtil.zGetRank(key, value);
}
/**
* 获取用户的分数
*/
@Override
public double zGetScore(String value) {
return redisUtil.zGetScoreByValue(key, value);
}
/**
* 获取排行榜,按照分数从大到小排序
*/
@Override
public Set<TypedTuple<Object>> rankWithScore() {
return redisUtil.zReverseRangeWithScore(key);
}
}
排行榜里面,总共有三个参数,key = "USER_SCORE_RANK",表示排行榜的key,排行榜里面所有用户数据的key都是这个"USER_SCORE_RANK";value表示用户信息,可以存user_id,user_name等信息;socre表示用户的分数,排行榜里面,就是按照这个score进行排序。
4.RankController
package com.ljessie.redisdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ljessie.redisdemo.service.RankService;
@RestController
@RequestMapping("/rank/")
public class RankController {
@Autowired
RankService rankService;
@RequestMapping("/add_source")
public Object addSource(String uid,double score) {
if(rankService.zAdd(uid, score)) {
return "add source success";
}else {
return "add source failed";
}
}
@RequestMapping("/increase_score")
public String increaseScore(String uid,double score) {
rankService.zIncreamentScore(uid, score);
return "user_score:"+rankService.zGetScore(uid);
}
@RequestMapping("/get_rank_by_uid")
public String getRank(String uid) {
long rank = rankService.zGetRank(uid);
return "user_rank:"+rank;
}
@RequestMapping("/get_rank")
public Object getRank() {
return rankService.rankWithScore();
}
}