PHP   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php中Redis的应用--消息传递大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

阅读目录

1、摘要

2、实现方法

3、一对一消息传递

4、多对多消息传递

1、摘要

消息传递这一应用广泛存在于各个网站中,这个功能也是一个网站必不可少的。常见的消息传递应用有,新浪微博中的@我呀、给你评论然后的提示呀、赞赞赞提示、私信呀、甚至是发微博分享的新鲜事;知乎中的私信呀、live发送过来的消息、知乎团队消息呀等等。

2、实现方法

消息传递即两个或者多个客户端在相互发送和接收消息。

通常有两种方法实现:

第一种为消息推送。

Redis内置有这种机制,publish往频道推送消息、subscribe订阅频道。这种方法一个缺点就是必须保证接收者时刻在线(即是此时程序不能停下来,一直保持监控状态,假若断线后就会出现客户端丢失信息)

第二种为消息拉取。

所谓消息拉取,就是客户端自主去获取存储在服务器中的数据。Redis内部没有实现消息拉取这种机制。因此我们需要自己手动编写代码去实现这个功能

在这里我们,我们进一步将消息传递再细分为一对一的消息传递,多对多的消息传递(群组消息传递)。

【注:两个类的代码相对较多,因此将其折叠起来了】

3、一对一消息传递

例子1:一对一消息发送与获取

模块要求:

1、提示有多少个联系人发来新消息

2、信息包含发送人、时间、信息内容

3、能够获取之前的旧消息

4、并且消息能够保持7天,过期将会被动触发删除

Redis实现思路:

1、新消息与旧消息分别采用两个链表来存储

2、原始消息的结构采用数组的形式存放,并且含有发送人、时间戳、信息内容

3、在推入redis的链表前,需要将数据转换为json类型然后再进行存储

4、在取出新信息时应该使用rpoplpush来实现,将已读的新消息推入旧消息链表中

5、取出旧消息时,应该用旧消息的时间与现在的时间进行对比,若超时,则直接删除后面的全部数据(因为数据是按时间一个一个压进链表中的,所以对于时间是有序排列的)

数据存储结构图:

php中Redis的应用--消息传递

PHP的实现代码

#SinglePullMessage.class.PHP

PHP;">
redis=new Redis();
 $this->redis->connect($host,$port);
 } 
 /**
 * @desc 发送消息(一个人)
 * 
 * @param $toUser string | 接收人
 * @param $messageArr array | 发送的消息数组,包含sender、message、time 
 *
 * @return bool
 */
 public function sendSingle($toUser,$messageArr)
 {
 $json_message=json_encode($messageArr); #编码成json数据
 return $this->redis->lpush($toUser,$json_message); #将数据推入链表 
 }
 /**
 * @desc 用户获取新消息
 *
 * @param $user string | 用户名
 *
 * @return array 返回数组,包含多少个用户发来新消息,以及具体消息
 */
 public function getNewMessage($user)
 {
 #接收新信息数据,并且将数据推入旧信息数据链表中,并且在原链表中删除
 $messageArr=array();
 while($json_message=$this->redis->rpoplpush($user,'preMessage_'.$user))
 {
  $temp=json_decode($json_message); #将json数据变成对象
  $messageArr[$temp->sender][]=$temp; #转换成数组信息
 }
 if($messageArr)
 {
  $arr['count']=count($messageArr); #统计有多少个用户发来信息
  $arr['messageArr']=$messageArr;
  return $arr;
 }
 return false;
 }
 public function getPreMessage($user)
 {
 ##取出旧消息
 $messageArr=array();
 $json_pre=$this->redis->lrange('preMessage_'.$user,-1); #一次性将全部旧消息取出来
 foreach ($json_pre as $k => $v) 
 {
  $temp=json_decode($v);  #json反编码
  $timeout=$temp->time+60*60*24*7; #数据过期时间 七天过期
  if($timeoutredis->del('preMessage_'.$user);
   break;
  }
  $this->redis->ltrim('preMessage_'.$user,$k); #若检测出有过期的,则将比它之前插入的所有数据删除
  break;
  }
  $messageArr[$temp->sender][]=$temp;
 }
 return $messageArr;
 }
 /**
 * @desc 消息处理,没什么特别的作用。在这里这是用来处理数组信息,然后将其输出。 
 *
 * @param $arr array | 需要处理的信息数组
 *
 * @return 返回打印输出
 */
 public function dealArr($arr)
 {
 foreach ($arr as $k => $v) 
 {
  foreach ($v as $k1 => $v2) 
  {
  echo '发送人:'.$v2->sender.' 发送时间:'.date('Y-m-d h:i:s',$v2->time).'
'; echo '消息内容:'.$v2->message.'
'; } echo "
"; } } }

大佬总结

以上是大佬教程为你收集整理的php中Redis的应用--消息传递全部内容,希望文章能够帮你解决php中Redis的应用--消息传递所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:phpredis