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