前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >socket.io-redis 文档翻译

socket.io-redis 文档翻译

作者头像
治电小白菜
发布2020-08-25 15:16:01
1.7K0
发布2020-08-25 15:16:01
举报
文章被收录于专栏:技术综合技术综合

socket.io-redis

如何去使用

代码语言:javascript
复制
const io = require('socket.io')(3000);
const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ host: 'localhost', port: 6379 }));

通过使用socket.io-redis 适配器运行socket.io 你可以在不同的进程或者服务器上运行多个socket.io实例,这样可以每个客户端广播和发送事件。

下面是一些命令:

代码语言:javascript
复制
io.emit('hello', '给所有客户端发送');
io.to('room42').emit('hello', "给所有在'room42'房间的客户端发送");

io.on('connection', (socket) => {
  socket.broadcast.emit('hello', '给所有除了发送者的客户端发送');
  socket.to('room42').emit('hello', "给所有在'room42'房间除了发送者的客户端发送");
});

将通过Redis 订阅/发布机制,给客户端广播

如果你想通过非socket.io进程向socket.io广播,你需要使用socket.io-emitter.

API

adapter(uri[, opts])

uri 是一个类似 localhost:6379 的字符串,如果你的 redis 是本地的. 下面列出了一些配置项

adapter(opts)

下列是被允许的配置项:

  • key: 订阅/发布事件的key的名称,比如(socket.io)
  • host: 连接redis的主机 (localhost)
  • port: 连接redis的端口(6379)
  • pubClient: 可选的, redis客户端的发布事件
  • subClient: 可选的, redis客户端的订阅时间
  • requestsTimeout: 可选的, 超时后适配器将停止响应请求(5000ms)

如果你决定提供pubClientsubClient, 确定你使用make sure you use node_redis 作为客户端或者一个同等的API

RedisAdapter

redis适配器实例暴露了下面的属性,这是一般 适配器 所没有的

  • uid
  • prefix
  • pubClient
  • subClient
  • requestsTimeout

RedisAdapter#clients(rooms:Array, fn:Function)

返回连接房间名为rooms 的所有节点的客户端ID列表.查看 Namespace#clients(fn:Function)

代码语言:javascript
复制
io.of('/').adapter.clients((err, clients) => {
  console.log(clients); // 一个包含所有连接上的客户端id的数组
});

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
  console.log(clients); // 一个包括了房间名为'room1' 和/或 'room2'的客户端id的数组
});

// 你也可以这样用
io.in('room3').clients((err, clients) => {
  console.log(clients); // 一个包括了'room3'房间内所有客户端id的数组
});

RedisAdapter#clientRooms(id:String, fn:Function)

返回给定客户端ID加入的房间的列表(甚至是在其他节点).

代码语言:javascript
复制
io.of('/').adapter.clientRooms('<my-id>', (err, rooms) => {
  if (err) { /* 未知 id */ }
  console.log(rooms); // 一个包含所给id的客户端加入的所有房间的数组
});

RedisAdapter#allRooms(fn:Function)

返回包含所有房间的列表

代码语言:javascript
复制
io.of('/').adapter.allRooms((err, rooms) => {
  console.log(rooms); // 一个包括所有房间的数组 (所有节点)
});

RedisAdapter#remoteJoin(id:String, room:String, fn:Function)

让socket给定的id加入房间。回调将在socket加入到房间后触发,否则如果没有找到socket客户端,会提供一个err 参数

代码语言:javascript
复制
io.of('/').adapter.remoteJoin('<my-id>', 'room1', (err) => {
  if (err) { /* 未知 id */ }
  // 成功
});

RedisAdapter#remoteLeave(id:String, room:String, fn:Function)

使给定socketid的客户端离开房间。回调将在客户端离开房间后触发,如果没找到socket客户端,则会返回一个arr参数.

代码语言:javascript
复制
io.of('/').adapter.remoteLeave('<my-id>', 'room1', (err) => {
  if (err) { /* 未知的 id */ }
  // 成功
});

RedisAdapter#remoteDisconnect(id:String, close:Boolean, fn:Function)

使给定id的socket客户端断开连接M. 如果将 close 设置为true, 它也将关闭其底层等socket。回调将会在socket客户端断开连接后调用,如果socket客户端没找到,则会返回一个 err 参数.

代码语言:javascript
复制
io.of('/').adapter.remoteDisconnect('<my-id>', true, (err) => {
  if (err) { /* 未知的 id */ }
  // 成功
});

RedisAdapter#customRequest(data:Object, fn:Function)

给所有节点发送一个请求,将会通过 customHook 的方法响应.

代码语言:javascript
复制
// 所有节点
io.of('/').adapter.customHook = (data, cb) => {
  cb('hello ' + data);
}

// 之后
io.of('/').adapter.customRequest('john', function(err, replies){
  console.log(replies); // an array ['hello john', ...] with one element per node
});

客户端错误处理

接收Redis适配器实例的 pubClientsubClient 属性来订阅它的'error'时间:

代码语言:javascript
复制
const adapter = require('socket.io-redis')('localhost:6379');
adapter.pubClient.on('error', function(){});
adapter.subClient.on('error', function(){});

pubClientsubClient发布的错误,也将被转发到适配器实例:

代码语言:javascript
复制
const io = require('socket.io')(3000);
const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ host: 'localhost', port: 6379 }));
io.of('/').adapter.on('error', function(){});

自定义 client (例如: with authentication)

如果你需要给一个redis实例创建一个有密码的redisAdapter, that has a password, 使用订阅/发布属性代替密码

代码语言:javascript
复制
const redis = require('redis');
const redisAdapter = require('socket.io-redis');
const pub = redis.createClient(port, host, { auth_pass: "pwd" });
const sub = redis.createClient(port, host, { auth_pass: "pwd" });
io.adapter(redisAdapter({ pubClient: pub, subClient: sub }));

With ioredis client

集群例子

代码语言:javascript
复制
const io = require('socket.io')(3000);
const Redis = require('ioredis');

const cluster = new Redis.Cluster([
  {
    port: 6380,
    host: '127.0.0.1'
  },
  {
    port: 6381,
    host: '127.0.0.1'
  }
]);

const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ pubClient: cluster, subClient: cluster }));

哨兵例子

代码语言:javascript
复制
const io = require('socket.io')(3000);
const Redis = require('ioredis');

const options = {
  sentinels: [
    { host: 'somehost1', port: 26379 },
    { host: 'somehost2', port: 26379 }
  ],
  name: 'master01'
};

const pubClient = new Redis(options);
const subClient = new Redis(options);

io.adapter(redisAdapter({ pubClient: options, subClient: options }));

协议

socket.io-redis 适配器 在特别命名的Redis通道上广播和接受信息。全局等广播通道名称为:

代码语言:javascript
复制
prefix + '#' + namespace + '#'

给单个房间广播的通道命名为:

代码语言:javascript
复制
prefix + '#' + namespace + '#' + room + '#'

还有其他的库采用这个协议:

License

MIT

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • socket.io-redis
    • 如何去使用
      • API
        • adapter(uri[, opts])
        • adapter(opts)
        • RedisAdapter
        • RedisAdapter#clients(rooms:Array, fn:Function)
        • RedisAdapter#clientRooms(id:String, fn:Function)
        • RedisAdapter#allRooms(fn:Function)
        • RedisAdapter#remoteJoin(id:String, room:String, fn:Function)
        • RedisAdapter#remoteLeave(id:String, room:String, fn:Function)
        • RedisAdapter#remoteDisconnect(id:String, close:Boolean, fn:Function)
        • RedisAdapter#customRequest(data:Object, fn:Function)
      • 客户端错误处理
        • 自定义 client (例如: with authentication)
          • With ioredis client
            • 集群例子
            • 哨兵例子
          • 协议
            • License
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档