【发布时间】:2015-10-12 23:09:50
【问题描述】:
我最近刚刚建立了一个聊天,它运行得很好,但我想我需要将它连接到 redis。
据我了解,如果客户端刷新或服务器出现故障,我需要 redis 来扩展和保存一些数据。
1on1 聊天的一个核心组件是我存储用户,并将socket.id 关联到这些用户
var users = {};
io.sockets.on('connection', function (socket) {
// store the users & socket.id into objects
users[socket.handshake.headers.user.username] = socket.id;
});
现在在客户端我可以说,嘿,我想和“杰克”聊天,只要那是一个有效的用户,我就可以将该数据传递给服务器,即用户名和消息只是为了杰克.
var chattingWith = data.nickname; // this is Jack passed from the client side
io.to(users[chattingWith]).emit();
我的问题是,我为什么要使用redis?我应该在redis中存储什么?我应该如何与这些数据进行交互?
我正在使用io.adapter
io.adapter(redisIo({
host: 'localhost',
port: 6379,
pubClient: pub,
subClient: sub
}));
还从示例应用程序中读取代码,我看到当套接字连接时,它们将套接字数据保存到 redis 中,就像这样。
// store stuff in redis
redisClientPublish.sadd('sockets:for:' + userKey + ':at:' + room_id, socket.id, function(err, socketAdded) {
if(socketAdded) {
redisClientPublish.sadd('socketio:sockets', socket.id);
redisClientPublish.sadd('rooms:' + room_id + ':online', userKey, function(err, userAdded) {
if(userAdded) {
redisClientPublish.hincrby('rooms:' + room_id + ':info', 'online', 1);
redisClientPublish.get('users:' + userKey + ':status', function(err, status) {
io.sockets.in(room_id).emit('new user', {
nickname: nickname,
provider: provider,
status: status || 'available'
});
});
}
});
}
});
他们在进入房间时使用它来获取有关房间的信息。
app.get('/:id', utils.restrict, function(req, res) {
console.log(redisClientPublish);
utils.getRoomInfo(req, res, redisClientPublish, function(room) {
console.log('Room Info: ' + room);
utils.getUsersInRoom(req, res, redisClientPublish, room, function(users) {
utils.getPublicRoomsInfo(redisClientPublish, function(rooms) {
utils.getUserStatus(req.user, redisClientPublish, function(status) {
utils.enterRoom(req, res, room, users, rooms, status);
});
});
});
});
});
所以,我再次问,因为我有点困惑是否需要在 redis 中存储任何东西/为什么需要,例如我们可能有几十万用户和 node.js 服务器“Jack”和“ Mike" are chatting on 掉线了,然后它变成了指向一个新的 node.js 实例。
显然我希望聊天仍然记得“杰克”的套接字 id 是“12333”和“迈克的”套接字 id 是“09278”所以每当“杰克”说嘿我想向服务器发送“迈克/09278”一条消息侧插座会正确引导它。
将用户名存储为键并将套接字 ID 存储为值是否是 redis 的明智用例,socket.id 是否仍然有效?
【问题讨论】:
标签: node.js sockets redis socket.io