nodejs 实现 redis 的消息发布及订阅

1 篇文章 0 订阅
1 篇文章 0 订阅

nodejs 实现 redis 的消息发布及订阅

业务需求

大家好,我终于踩坑了哈哈哈哈~~~
如果服务器是单线程的话 消息推送完全可以用websocket来实现,参考我上一个文章 websocket消息发送
但是呢我这个上到测试环境就出现了问题,推送的消息偶尔能收到,偶尔收不到的情况 ,绞尽脑汁,最后问题是服务器采用集群的模式,是多线程的,所以就--------这时候redis就起作用了

在这里插入图片描述
现在的方法就是:通过 redis 来 广播消息,当 后台管理 请求, 要发送消息到 安卓端时, 你的 server ,把这个消息 发送到 redis,redis 再 发送到 所有的 server 上, server1, server2, server3
参考文档 Redis 发布订阅

实现方法(koa)

流程

1.首先客户端的消息发送到redis上,然后将发送的消息内容值publish到 chat频道

const Redisdb = require('ioredis')

module.exports = class Redis {
  constructor () {
    this.config = {
      port: 6379,
      host: process.env.REDIS_HOSTNAME || 'redis',
      password: process.env.REDIS_PASSWORD || null,
      db: process.env.REDIS_DATABASE || 1
    }
    this.client = new Redisdb(this.config)
  }

//传入需要下发的消息
  async pub (messageId, name, tourguide, content) {
    const confi =
    {
      type: 'TEXT',
      messageId: messageId,
      name: name,
      content: content,
      targets: tourguide
    }
    const rustu = JSON.stringify(confi) // 将json转化成string
    console.log(rustu)
    this.client.publish('chat', rustu)// client将文本发布到chat这个频道
    // 然后订阅这个频道的订阅者就会收到消息
  }
}

2.readRedis.js文件此前一直在监听chat频道,readRedis.js文件接收到member后,通过socket将数据传到app 端

const Redisdb = require('ioredis')
const Sockets = require('../../socket/sockets')
const sockets = Sockets.getInstance()

module.exports = class ReadRedis {
  constructor () {
    this.config = {
      port: 6379,
      host: process.env.REDIS_HOSTNAME || 'redis',
      password: process.env.REDIS_PASSWORD || null,
      db: process.env.REDIS_DATABASE || 1
    }
    this.client = new Redisdb(this.config)
  }
  getRedisData () {
    // 客户端连接redis成功后执行回调
    this.client.on('ready', function () {
      console.log('ready')
      // 订阅消息
    })
    this.client.subscribe('chat')
    console.log('订阅成功。。。')

    this.client.on('error', function (error) {
      console.log('Redis Error ' + error)
    })
    this.client.on('connect', function () {
      console.log('redis connect ok')
    })
    // 监听订阅成功事件
    this.client.on('subscribe', function (channel, count) {
      console.log('client subscribed to ' + channel + ',' + count + 'total subscriptions')
    })

    // 收到消息后执行回调,message是redis发布的消息
    this.client.on('message', function (channel, message) {
      console.log('我接收到信息了' + message)
      //消息通过socket发送到app
      if (sockets.getAll().size === 0) {
      // 先判断是否有设备连接 在决定是否发送,避免内存元泄漏
        console.log('已经连接的安卓设备数量为0,群发失败')
      } else {
        console.log('asd12d')
        for (const socket of sockets.getAll().values()) {
          console.log('12的多大')
          socket.emit('message', {
            type: 'TEXT',
            messageId: message.messageId,
            name: message.name,
            content: message.content,
            targets: message.tourguide
          })
        }
      }
    })
  }
}

3.在开启项目时 需要开启.readRedis.js文件中getRedisData方法

在Node.js中,可以使用Redis作为消息队列来实现异步任务的处理。引用[1]展示了使用Node.js连接Redis的代码示例,其中通过redis.createClient()方法创建了与Redis的连接。引用是一个Redis连接的工具函数示例,展示了如何创建Redis连接并选择数据库。引用是一个使用Redis作为消息队列的核心逻辑示例,展示了如何创建Redis连接并通过死循环来获取任务并处理。 在这个示例中,首先通过redisCreateClient函数创建了与Redis的连接,并选择了指定的数据库。然后,在一个无限循环中,通过brPop方法从队列中获取任务,并进行相应的处理。如果获取到的任务为空,则继续循环等待下一个任务。如果发生错误,会打印错误信息并继续下一个循环。 这个示例展示了如何使用Node.js和Redis实现一个简单的消息队列,可以用于处理异步任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用Node.js驱动Redis,实现一个消息队列!](https://blog.csdn.net/petertanjinjie/article/details/106821936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Nodejs + Redis = MQ(简易消息队列实现)](https://blog.csdn.net/qq_32930863/article/details/125882837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值