正文
@Scheduled(fixedRate = 60000) // 每分钟执行一次
public void updateRankingCache() {
List rankings = userScoreDao.getTop1000Scores();
redisTemplate.opsForValue().set("ranking_list", rankings);
}
public List getRankingList() {
return (List) redisTemplate.opsForValue().get("ranking_list");
}
优点
:
缺点
:
架构图如下
:
方案三:Redis有序集合
适用场景
:数据量大(百万级),需要实时更新
Redis的有序集合(Sorted Set)是实现排行榜的利器。
示例代码如下:
public void addUserScore(String userId, double score) {
redisTemplate.opsForZSet().add("ranking", userId, score);
}
public List getTopUsers(int topN) {
return redisTemplate.opsForZSet().reverseRange("ranking", 0, topN - 1);
}
public Long getUserRank(String userId) {
return redisTemplate.opsForZSet().reverseRank("ranking", userId) + 1;
}
优点
:
缺点
:
架构图如下
:
方案四:分片+Redis集群
适用场景
:超大规模数据(千万级以上),高并发场景
当单机Redis无法满足需求时,可以采用分片方案。
示例代码如下:
//
public void addUserScore(String userId, double score) {
RScoredSortedSet set = redisson.getScoredSortedSet("ranking:" + getShard(userId));
set.add(score, userId);
}
private String getShard(String userId) {
// 简单哈希分片
int shard = Math.abs(userId.hashCode()) % 16;
return "shard_" + shard;
}
在这里我们以Redisson客户端为例。
优点