如何在Laravel,Redis,SocketIO中有效显示用户的在线状态

时间:2018-08-24 10:38:53

标签: laravel laravel-5 redis socket.io

最近我一直在研究使用React构建的实时Web应用程序。我想显示当前哪些用户在线。我想到了许多不同的实现方式,并选择了以下实现。

在我的Laravel登录控制器中,用户成功登录后,我已将用户电子邮件作为密钥存储,并将用户ID作为值存储在Redis哈希结构中。
在获取用户控制器中,我正在检查每个用户的电子邮件是否在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 Application中,我按如下方式处理事件

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万用户。那么,有没有人有更好的方法或关于如何改进此实现的建议?

0 个答案:

没有答案