Nodejs中socket.io为什么依赖redis 哪儿用到了
Nodejs中socket.io为什么依赖redis 哪儿用到了
没代码看不了吧?可能是你保存session到redis了吧
socket.io应该是可以依赖redis做多进程和集群之间的信息共享
socket.io的store是独立的,可以设置成各种存储方式,默认的是放在本进程里,如果需要cluster多进程模式,就需要修改为redis或其他存储方式
Node.js 中 socket.io
依赖 Redis 主要是为了实现多服务器间的消息传递和共享会话状态。当应用需要在多个服务器实例之间进行通信时,Redis 可以作为一个中央存储来同步这些实例的状态。
示例场景
假设你有一个 Web 应用,用户可以在其中发送实时消息。该应用运行在多个服务器实例上。为了确保所有实例都能收到新消息,你需要一个共享存储,即 Redis,来存储这些消息。这样,每当一个客户端发送一条消息时,服务端会将这条消息存入 Redis,然后 Redis 会通知其他服务器实例获取并广播这条消息给它们的客户端。
实际使用示例
// 服务端代码
const io = require('socket.io')(server, {
adapter: require('socket.io-redis')({
host: 'localhost',
port: 6379
})
});
io.on('connection', (socket) => {
console.log('a user connected');
socket.on('chat message', (msg) => {
io.emit('chat message', msg); // 将消息广播给所有连接的客户端
});
socket.on('disconnect', () => {
console.log('user disconnected');
});
});
代码解释
-
创建 Socket.IO 实例:
const io = require('socket.io')(server, { adapter: require('socket.io-redis')({ host: 'localhost', port: 6379 }) });
这里通过配置
adapter
参数,使用socket.io-redis
插件来指定 Redis 作为 Socket.IO 的适配器,使得 Socket.IO 可以利用 Redis 来存储和同步连接状态和事件。 -
处理客户端消息:
socket.on('chat message', (msg) => { io.emit('chat message', msg); });
当接收到客户端的聊天消息时,该消息会被广播给所有连接的客户端。
-
断开连接处理:
socket.on('disconnect', () => { console.log('user disconnected'); });
客户端断开连接时,记录日志。
通过上述配置,可以确保在多个服务器实例之间共享状态,使得所有客户端能够接收到广播的消息。这就是为什么在某些情况下 socket.io
依赖于 Redis。