如何高效地向用户展示';s在Laravel、Redis、SocketIO的在线状态
最近我一直在开发一个使用React构建的实时web应用程序。我想显示当前哪些用户在线。我考虑了许多不同的实现方法,并选择了以下实现 在我的Laravel登录控制器中,在用户成功登录后,我将用户电子邮件作为密钥和用户id作为值存储在Redis哈希结构中。如何高效地向用户展示';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
在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我还没有实现,稍后会做,因为这不是当务之急。