如何高效地向用户展示';s在Laravel、Redis、SocketIO的在线状态

如何高效地向用户展示';s在Laravel、Redis、SocketIO的在线状态,laravel,laravel-5,redis,socket.io,Laravel,Laravel 5,Redis,Socket.io,最近我一直在开发一个使用React构建的实时web应用程序。我想显示当前哪些用户在线。我考虑了许多不同的实现方法,并选择了以下实现 在我的Laravel登录控制器中,在用户成功登录后,我将用户电子邮件作为密钥和用户id作为值存储在Redis哈希结构中。 在get users控制器中,我检查每个用户的电子邮件是否作为Redis哈希中的密钥存在,如下所示 $users = User::all(); $users->map(function($user){ $user->setAt

最近我一直在开发一个使用React构建的实时web应用程序。我想显示当前哪些用户在线。我考虑了许多不同的实现方法,并选择了以下实现

在我的Laravel登录控制器中,在用户成功登录后,我将用户电子邮件作为密钥和用户id作为值存储在Redis哈希结构中。
在get users控制器中,我检查每个用户的电子邮件是否作为Redis哈希中的密钥存在,如下所示

$users = User::all();
$users->map(function($user){
    $user->setAttribute('online', 0);
    if(Redis::hget('ActiveUsers',$user->email)) {
        $user->setAttribute('online', 1);
    }
});
return $users;
至于状态的实时显示,我正在使用SocketIO和Redis发布/订阅功能

redis.on('message', (channel, message) => {
    io.emit('someone-logged-in', msg.data.id);
});

io.on('connection', (socket) => {

redis.subscribe('logged-in');
socket.on('loggedOut', data => {
    ActiveUsersRedis.hdel("ActiveUsers", data.email);
    io.emit('someone-logged-out', data.id);
});
在我的React应用程序中,我将按如下方式处理事件

this.state.socket.on('someone-logged-out',data => {
    let i = this.state.activeUsersId.indexOf(parseInt(data, 10));
    if(i !== -1)
    {
        this.state.activeUsersId.splice(i, 1);
        this.setState({activeUsersId: this.state.activeUsersId});
    }
});
this.state.socket.on('someone-logged-in',data => {
    let e = true;
    if(this.props.users.data)
        e = this.props.users.data.some(user => user.id === data);
    if(e) this.setState({activeUsersId: [...this.state.activeUsersId,data]});
});

我不知道这是最好的方式还是最佳的解决方案,或者它是否可以扩展到10万用户。那么,是否有人对如何改进此实现有更好的方法或建议?

有人注销了
,如果我关闭浏览器会怎么样?@Kyslik我还没有实现,稍后会做,因为这不是当务之急。