为Socket.IO保留内存中的新数据

时间:2017-07-31 14:28:52

标签: node.js websocket redis socket.io relational-database

我正在使用Socket.IO创建一个Node.js Web应用程序 目前我使用Passport.js及其Socket.IO中间件,它为每个套接字提供了user对象(由Passport.js反序列化逻辑从MySQL加载):

io.on('connection', function (socket) {
  const user = socket.request.user;
  socket.on('event', (data) => {
    // ...
  });
});

但是,user中的数据是固定的(在连接时加载),所以我不能在回调中使用用户的任何«非静态»属性来进行套接字事件。
示例:用户发送聊天消息,我想将其广播到该用户的当前房间(由MySQL中的user_id用户字段标识)。每次事件发生时查询相对较慢的MySQL显然不是一个选项(我也会每秒发送一些事件,比如实时绘图)。

问题#1:解决此类任务的正确方法是什么?我目前考虑Redis(即保留所需的或所有数据在Redis中重复并在每个事件上检查Redis(应该足够快?)。

问题#2:如果我所描述的使用Redis是一种可接受的方法,那么保存这种重复数据的最佳做法是什么?我的意思是,任何改变数据库中“需要重新创建”数据的代码现在都必须在Redis中更新它。也许在代码中创建一些额外的抽象级别,大致类似于更新DB和Redis的userService.setRoom(),并且必须在所有地方调用此方法而不是像以前那样直接更改?听起来像是一个相当多的额外工作,但我不确定另一种方法来实现这一目标。

提前致谢。

0 个答案:

没有答案