Redis实现聊天功能

不光redis能实现来聊天的功能,很多数据库都能实现,也不是说非得key-value类型的数据库,关系型数据库也可以,用心跳机制(多少时间访问数据库来维持数据的最新)
转载自https://www.cnblogs.com/qlqwjy/p/9784956.html

1,redis实现一对一的聊天功能(基于lpush和brpop实现)

一对一聊天的思路:(采用LpushBrpop实现)
  1.消息生产者生产消息到redis中:生产消息的时候根据接收人的userName与消息的类型发送到对应的key,采用lpush发送消息(根据userName生成key)
  2.消息的消费者根据userName,从userNamekey中消费对应的消息。如果有必要可以将消息写到RDB中避免数据的丢失。(根据userName生成key的规则获取用户对应的消息)
  3.消息的内容头部加入发送者,例如原来消息内容是:hello,为了知道消息的发送者可以改为:张三*-*hello(为了获取消息的发送者)

群聊功能(基于发布/订阅实现)

群聊的思路:采用发布订阅模式实现(publishsubscribe实现)
  1.每个channel都有一个频道每一个channel代表一个群,用户每次订阅这个房间都代表进入这个群,可以发送与接收消息
  2.发送者每次发送消息需要先进入房间,也就是订阅channel,之后可以向该频道发送消息
  3.接收者需要先进入房间,也就是订阅channel,然后接收消息
  
  也就是不管发送消息与接收消息,都需要先订阅channel进入房间。用户进入某个房间可以存入到zSet,每次进入某个房间发送消息判断是否已经进入某个房间。比如:
房间room1,则channel就是room1,保存其成员的set就是room1members。
总的来说:
  每个房间都是一个channel,进入房间的成员订阅该channel。每个房间的成员保存在一个zset中,key可以定义为roomName+"users"
  用户退出房间的时候需要退出该房间,也就是退订该channel,同时在zset中移除该成员。(退订只能调用JedisPubSubunsubscribe实现)。
也就是一个房间对应的信息如下:
  一个channel,名称为 roomName 发送的群消息到这个channel
  一个zset,对应的key为roomName+“users”,保存的是进入该房间的用户,用户退出房间需要借助退出房间的消息以及退订实现
  发送群聊消息直接publish消息到该roomName即可。

实际操作转载自https://www.cnblogs.com/qlqwjy/p/9784956.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值