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