redis 实现直播聊天(后台逻辑)

 

简单需求:直播的时候用户聊天的需求

后台实现:分为两个接口:发送消息接口和请求消息接口

主要点:redis的mget 的使用,

以及key值的设计

用直播期数【liveNum】作为当前期目前消息的总条数,使用incr在发送接口来累加总条数

每条消息的key:直播期数【liveNum】_当前消息第几条

实体类的属性

public class LiveChat {
   /**
    * 当前期的第几条数据
   */
   private Integer id;

   /**
    * 直播期数
    */
   private String liveNum;
   /**
    * 用户编号
    */
   private String userNo;
   /**
    * 内容
    */
   private String content;
}

 

②发送消息的代码

public boolean sendMessage(LiveChat liveChat) {
      
   //验证敏感词
   
   //非空验证
   
   //消息存到缓存
   String liveNum = liveChat.getLiveNum();

   ValueOperations valueOperations = redis.getValueOperations();
   //将当前消息累计到消息的总条数的
   Long increment = valueOperations.increment(liveNum, 1);
   StringBuilder builder = new StringBuilder(liveNum);
   builder.append("_");
   valueOperations.set(builder.append(String.valueOf(increment)).toString(), liveChat);
   return true;
   //消息存到消息队列
   
}

 

③获取消息的接口 参数liveNum:直播期数;lastNum:上次请求时最新的条数

 

public List getMeaasge(String liveNum,long lastNum) {

   ValueOperations valueOperations = redis.getValueOperations();

   //当前消息已经累计的条数
   Object object = valueOperations.get(liveNum);
   if(object!=null) {
      long current = Long.valueOf(object.toString());
      List keys = new ArrayList();
      for (long i = current; i > lastNum; i--) {
         StringBuilder builder = new StringBuilder(liveNum);
         builder.append("_");
         keys.add(builder.append(String.valueOf(i)).toString());
      }
      System.out.println("keys===="+keys);
      List multiGet = valueOperations.multiGet(keys);
      System.out.println("multiGet ===="+multiGet);
      return multiGet;
   }
   System.out.println("当前期数的消息数为0");
   return null;

上面是主要的代码逻辑,添加上Controller之后,就可以调用接口来进行测试

用户发送消息调用sendMessage接口

比如redis 实现直播聊天(后台逻辑)_第1张图片

用户进入直播页面前端可以采用每隔2秒访问getMeaasge方式来获取信息,刚开始进去lastNum值为0,以后的值为上一次请求数据时最大的数据条数

redis 实现直播聊天(后台逻辑)_第2张图片

(此时在发送两个聊天数据)

请求参数变成1

redis 实现直播聊天(后台逻辑)_第3张图片

总结:①主要用了redis命令中的incr和mget

②发送接口的参数

{
    "liveNum":"20190812",
    "userNo":"201903140000",
    "content":"第3条消息"
}没有什么特殊的地方

③请求接口的参数liveNum,直播期数(我放在了请求头里面)和lastNum上一次请求最新的消息的id(这个为了前端方便取出来,也可以单独拿出来,而不是和返回的消息数据耦合在一起)

④消息key值得设计,为了使用multiget的,key设计成了 直播期数【liveNum】_当前消息第几条

另外可以加上消息队列来进行数据落地到mysql等数据库;如果用户中途进入,消息产生了很多,可以设置最多返回条数等等;根据场景设置消息过期时间

备注(业务逻辑经过正式线验证,虽然之前正式线用的是memcache实现的,但是逻辑类似;这个redis是单机模式,redis自带集群中用mget命令需要修改key的设计方式,让请求总命中同样的slot上)

你可能感兴趣的:(redis,解决方案)