业务场景
在一个社交媒体平台中,我们需要实时统计用户的点赞数和在线人数。为了满足实时性和高并发的需求,我们决定使用 Redis 来实现一个实时计数器。
业务需求
- 实时统计用户的点赞数,以便在用户界面上显示点赞数的实时更新。
- 实时统计在线用户人数,以便在管理后台实时监控在线用户的数量。
需求分析
- 计数器需要能够实时更新,并能够处理高并发的请求。
- 计数器的数据需要持久化,以防止数据丢失。
实现方案
- 使用 Redis 的计数器功能来存储和更新点赞数和在线用户数。
- 使用 Redis 的键过期功能来自动清除超时的在线用户。
- 使用 Redis 的持久化功能,如 AOF 或 RDB,来保证数据的持久性。
- 使用 Redis 的事务功能来确保计数器的原子性更新。
示例代码
以下是一个简化的示例代码,展示了如何使用 Redis 实现实时计数器的关键部分:
// 用户点赞操作
public void likePost(String postId, String userId) {
Jedis jedis = new Jedis("localhost");
jedis.incr("post_likes:" + postId); // 增加点赞数
jedis.sadd("post_liked_users:" + postId, userId); // 添加点赞用户
jedis.close();
}
// 获取帖子的点赞数
public long getPostLikes(String postId) {
Jedis jedis = new Jedis("localhost");
long likes = Long.parseLong(jedis.get("post_likes:" + postId));
jedis.close();
return likes;
}
// 用户上线操作
public void userOnline(String userId) {
Jedis jedis = new Jedis("localhost");
jedis.setex("user_online:" + userId, 300, "true"); // 设置用户在线标志,并设置过期时间为 300 秒
jedis.close();
}
// 获取在线用户数
public long getOnlineUserCount() {
Jedis jedis = new Jedis("localhost");
long count = jedis.keys("user_online:*").size();
jedis.close();
return count;
}
在上述示例代码中,我们使用 Redis 的计数器功能来存储点赞数,并使用 Redis 的集合数据类型来存储点赞的用户。对于在线用户数的统计,我们使用 Redis 的键过期功能来设置用户在线标志的过期时间,并使用 Redis 的键查询功能来获取在线用户数。