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

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

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

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

// 客户端唯一的识别码
$client_id = session()->getId();
echo $client_id . '
'; // 按日期生成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 . '
'; // 可实现功能二:某时间段内在线人数 $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 . '
'; // 可实现功能三:最新上线的用户,时间从小到大排序 $newest = Redis::zRangeByScore($key, '-inf', '+inf', ['limit' => [0, 50]]); echo '最新上线的用户有:'; foreach ($newest as $value) { echo $value . ' '; } echo '
'; // 可实现功能四:指定用户是否在线 $username = $client_id; $online = Redis::zScore($key, $client_id);; echo $username . ($online ? '在线' : '不在线') . '
'; // 可实现功能五:昨天和今天都上线的客户 $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 . ' '; }

 

你可能感兴趣的:(架构)