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.Service;
import java.util.Set;
@Service
public class LeaderboardService {
@Autowired
private StringRedisTemplate redisTemplate;
// 添加分数到排行榜
public boolean addScoreToLeaderboard(String userId, double score) {
boolean result = redisTemplate.opsForZSet().add(LEADERBOARD_KEY, userId, score);
return result;
}
// 获取排行榜前N名的用户ID
public Set<String> getTopNUserIds(int N) {
return redisTemplate.opsForZSet().reverseRange(LEADERBOARD_KEY, 0, N - 1);
}
// 获取用户的排名
public Long getUserRank(String userId) {
return redisTemplate.opsForZSet().reverseRank(LEADERBOARD_KEY, userId);
}
// 获取用户的分数
public Double getUserScore(String userId) {
return redisTemplate.opsForZSet().score(LEADERBOARD_KEY, userId);
}
// 移除用户的分数
public boolean removeUser(String userId) {
return redisTemplate.opsForZSet().remove(LEADERBOARD_KEY, userId) > 0;
}
// 更新用户的分数
public void updateUserScore(String userId, double newScore) {
redisTemplate.opsForZSet().add(LEADERBOARD_KEY, userId, newScore);
}
// 私有常量,指定排行榜在Redis中的键
private static final String LEADERBOARD_KEY = "leaderboard";
}
这段代码使用了Spring Data Redis的StringRedisTemplate
来操作Redis的有序集合。它提供了添加、获取、删除和更新用户分数的方法,以及获取用户排名和排行榜上指定范围用户ID的方法。这个例子简洁明了,并且使用了Spring Boot框架的自动装配特性,使得与Redis的集成变得更加便捷。