分布式缓存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 的键查询功能来获取在线用户数。


2FHGX405..Yd