欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 统计在线人数,百万数据表,查询很慢,如何统计,用php如何实现

统计在线人数,百万数据表,查询很慢,如何统计,用php如何实现

2024/10/25 17:23:08 来源:https://blog.csdn.net/Crazy_shark/article/details/142050305  浏览:    关键词:统计在线人数,百万数据表,查询很慢,如何统计,用php如何实现

        统计在线人数时,如果数据表有百万级别的数据,直接查询数据库会导致性能瓶颈,查询速度非常慢。对于这种大数据量的实时统计,使用数据库查询并不是最好的方案。相反,可以借助缓存或类似 Redis 的内存数据库来实现高效的在线人数统计。

常见的解决方案

1. 使用 Redis 实现在线人数统计

        Redis 是一个高性能的内存数据库,适合处理高并发请求和实时数据处理。通过 Redis 可以避免直接查询数据库的开销,下面是 Redis 实现在线人数统计的思路。

Redis 方案步骤
  • 每次用户登录时,将用户的 ID 或其他唯一标识保存到 Redis 的集合(SET 数据结构)中。
  • 用户离线时,从集合中移除该用户的 ID。
  • 使用 SCARD 命令统计集合中元素的个数,即为当前在线用户数。
具体实现
// Redis 连接配置
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);// 用户登录时
function userLogin($userId) {global $redis;// 使用集合保存在线用户,集合自动去重$redis->sAdd('online_users', $userId);
}// 用户离线时
function userLogout($userId) {global $redis;// 从集合中移除用户$redis->sRem('online_users', $userId);
}// 统计在线人数
function getOnlineUsersCount() {global $redis;// 获取集合的元素个数,即为在线人数return $redis->sCard('online_users');
}// 示例调用
userLogin(1001); // 用户1001登录
userLogin(1002); // 用户1002登录
userLogout(1001); // 用户1001下线// 获取在线人数
echo '当前在线人数: ' . getOnlineUsersCount();
Redis 的优点
  • 高性能:Redis 将数据保存在内存中,读写速度非常快。
  • 去重功能:Redis 的集合 SET 数据结构会自动去重,确保在线用户不会重复统计。
  • 并发处理:可以处理高并发场景,支持百万级别的在线用户管理。
2. 设置过期时间

        为了确保统计在线人数的准确性,你可以在 Redis 中为每个用户的会话设置一个过期时间。当用户长时间未活动时,会自动将其从在线用户集合中移除,避免统计冗余数据。

function userLoginWithExpiry($userId) {global $redis;// 设置每个用户的登录状态,并给它一个过期时间,比如 15 分钟$redis->setex('online_user_' . $userId, 900, time());  // 900 秒即 15 分钟
}// 更新在线用户(每次有活动)
function updateUserActivity($userId) {global $redis;// 刷新过期时间$redis->expire('online_user_' . $userId, 900);  // 900 秒即 15 分钟
}// 统计在线人数
function getOnlineUsersCountWithExpiry() {global $redis;// 获取所有键以 'online_user_' 开头的用户数据$keys = $redis->keys('online_user_*');return count($keys);
}
3. 使用 MySQL 配合缓存策略

如果你必须使用数据库来记录在线用户信息,可以采取以下优化方案:

  • 记录用户的最后活动时间:在用户表或一个专门的在线用户表中,记录用户的 user_idlast_active_time。然后只统计那些 last_active_time 在过去 15 分钟内的用户。
  • 查询优化:使用合适的索引和查询语句,避免全表扫描。
  • 缓存在线用户数:将统计结果缓存到 Redis 中,并定时从数据库中同步更新。

实现 MySQL + Redis 缓存

  1. 在用户表或在线用户表中记录最后活动时间。
  2. 定期从数据库中查询在线用户数,并将结果缓存到 Redis 中,设定缓存过期时间。
  3. 每次请求只查询 Redis,定期同步更新 Redis 的数据。
MySQL + Redis 代码示例
// 用户登录或有活动时,更新数据库中的最后活动时间
function updateLastActivity($userId) {$db = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');$stmt = $db->prepare("UPDATE users SET last_active_time = NOW() WHERE id = :userId");$stmt->execute(['userId' => $userId]);
}// 从数据库查询在线人数并缓存到 Redis
function updateOnlineUsersCountCache() {global $redis;$db = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');// 查询过去 15 分钟内活动的用户数量$stmt = $db->query("SELECT COUNT(*) FROM users WHERE last_active_time > NOW() - INTERVAL 15 MINUTE");$onlineCount = $stmt->fetchColumn();// 将结果缓存到 Redis 中,缓存有效期为 60 秒$redis->setex('online_users_count', 60, $onlineCount);return $onlineCount;
}// 获取在线人数
function getOnlineUsersCount() {global $redis;// 先从 Redis 获取缓存的在线人数$onlineCount = $redis->get('online_users_count');// 如果缓存不存在或过期,重新计算并更新缓存if ($onlineCount === false) {$onlineCount = updateOnlineUsersCountCache();}return $onlineCount;
}

总结

  • Redis 实现在线人数统计 是最常用的方案,适合高并发和大规模数据场景,能大大提高性能。
  • 结合数据库与缓存 的策略可以提供更准确的统计数据,但性能会受到一定影响。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com