你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

实时用户在线人数统计(二):redis有序集合

2022/6/30 2:19:35

可以用Redis的有序集合存储用户信息,来实现实时在线人数统计。

注:以下只为设计思路,代码均为模拟代码,不可作为正式项目使用。代码使用的laravel框架。

redis有序集合实现在线人数统计

// 客户端唯一的识别码
$client_id = session()->getId();
echo $client_id . '<br />';

// 按日期生成key
$day = date('Ymd');
$key = 'online:' . $day;

// 是否在线
$is_online = Redis::zScore($key, $client_id);
if (empty($is_online)) {    // 不在线,加入当前客户端
    Redis::zAdd($key, time(), $client_id);
}

// 注:无法通过用户操作时间清除掉无效用户,只有手动登出的用户才会从集合中删除

// 可实现功能一:当前总共在线人数
$c = Redis::zCard($key);
echo '当前在线人数:' . $c . '<br />';

// 可实现功能二:某时间段内在线人数
$begin_date = '2018-12-11 10:49:50';
$end_date = '2019-1-25 10:35:12';
$c = Redis::zCount($key, strtotime($begin_date), strtotime($end_date));
echo $begin_date . '-' . $end_date . '在线人数:' . $c . '<br />';

// 可实现功能三:最新上线的用户,时间从小到大排序
$newest = Redis::zRangeByScore($key, '-inf', '+inf', ['limit' => [0, 50]]);
echo '最新上线的用户有:';
foreach ($newest as $value) {
    echo $value . ' ';
}
echo '<br />';

// 可实现功能四:指定用户是否在线
$username = $client_id;
$online = Redis::zScore($key, $client_id);;
echo $username . ($online ? '在线' : '不在线') . '<br />';

// 可实现功能五:昨天和今天都上线的客户
$yestoday = Carbon::yesterday()->toDateString();
$yes_key = str_replace('-', '', $yestoday);
$members = [];
Redis::pipeline(function ($pipe) use ($key, $yes_key, &$members) {
    Redis::zinterstore('new_key', [$key, $yes_key], ['aggregate' => 'min']);
    $members = Redis::zRangeByScore('new_key', '-inf', '+inf', ['limit' => [0, 50]]);
    //dump($members);
});
echo '昨天和今天都上线的用户有:';
foreach ($members as $value) {
    echo $value . ' ';
}