分布式缓存Redis

实时计数器

2024-05-22 05:43:15

业务场景

在一个社交媒体平台中,我们需要实时统计用户的点赞数和在线人数。为了满足实时性和高并发的需求,我们决定使用 Redis 来实现一个实时计数器。

业务需求

实时统计用户的点赞数,以便在用户界面上显示点赞数的实时更新。

实时统计在线用户人数,以便在管理后台实时监控在线用户的数量。

需求分析

计数器需要能够实时更新,并能够处理高并发的请求。

计数器的数据需要持久化,以防止数据丢失。

实现方案

1. 使用 Redis 的计数器功能来存储和更新点赞数和在线用户数。

2. 使用 Redis 的键过期功能来自动清除超时的在线用户。

3. 使用 Redis 的持久化功能,如 AOF 或 RDB,来保证数据的持久性。

4. 使用 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 的键查询功能来获取在线用户数。