必威体育Betway必威体育官网
当前位置:首页 > IT技术

Redis如何实现消息队列

时间:2019-11-02 12:44:34来源:IT技术作者:seo实验室小编阅读:64次「手机版」
 

藏经阁

消息队列的实现方式有很多种,比如有专业的rabbitmq,rocketmq,kafka等,这些mq提供了非常专业的功能实现异步发送,而且这些接入又比较复杂。

Redis 利用 其 专有的数据结构list可以实现简单的消息队列和异步发送的需求,当然可专业的mq相比,在消息投递的可靠性和及时性上还是有差距,如果对异步发送要求比较高,则建议还是采用专业的mq中间件。

Redis如何实现消息队列

Redis的list可以用来实现消息队列,key用来表示队列名称,客户端向对应的key代表的队列发消息。发消息采用rpush,lpush实现,取消息采用rpop或lpop实现。

consumer端最好也是多个线程,防止一个线程崩溃或发生异常,队列消息积压的情况。

队列空了,利用pop这样会使Redis空轮询,浪费资源,此时可以让线程sleep一会儿再去取,可以明显的降低redis的负载。导致的问题是1s的消息延迟,这对于异步处理来说,已经很大了。

Redis提供了blpop和brpop可以进行阻塞读,没有消息的时候进行阻塞操作。

如果队列长时间没有消息,一直进行阻塞连接,redis会对空闲连接进行释放以减少资源浪费,所以必须对异常进行捕获重试。

Redis实现消息队列php代码

//消费端
public function consumerMsg($queueName){
  try{
      $value = $this->redis->brpop($queueName);
      do_callback($value);
  }catch(Exception $e){
      log($queueName, $e->getmessage());
      delayedretryMsg($queueName); //发生异常,延迟重试
  }
}
//发布端
public function publishMsg($queueName, $msg){
   try{
       $this->redis->lpush($queueName, $msg);
   }catch(Exception $e){
       log($queueName, $e->getMessage());
       $this->redis->lpush($queueName, $msg);//发生异常重试
   }
}

Redis如何实现延时队列

redis延时队列功能可以采用zset进行处理,将消息序列化为value,执行时间作为score,按照当前时间作为范围去取该执行的消息进行处理。处理线程建议是多个,防止一个线程发生异常导致整个队列不可用。

public function publishMsgToDelayQueue($queueKey, $msg){
     $this->redis->zadd($queueKey, time() + 5, $msg);//5s延迟队列
}

staitc $isOn = true;
public function getMsgFromQueue($queueKey){
    while($isOn){
     $values = $this->redis->zrangebyscore($queueKey, 0, time()); //取出当前时间执行的所有消息
     try {
        if(false == empty($values)){
         foreach($values as $msg){
            if($this->redis->zrem(queueKey, s) > 0)){
                do_handle($msg);
            }
          }
        }else{
          sleep(1);
        }
     }catch(Exception $e){
       $isOn = false;   
}
}


文章最后发布于: 2019-04-14 12:55:21

相关阅读

拆解企业建站选择疑问,实现网站价值最大化

越来越多的企业注重自身的品牌形象,在实体店形象升级改造的同时,企业也不会放过网络这一块大蛋糕。那么,做网站便是企业的需求了。但

企业绩效考核系统,让企业实现管理价值

绩效管理是现代人力资源管理的重要组成部分,而绩效考核又是绩效管理中的重要一环。但目前,不少企业对于绩效管理的认知依旧存在偏差

使用padding-bottom和margin-bottom实现两栏等高布局

声明:以下均为个人见解,若有错误请指出。效果预览:<!DOCTYPE html> <html> <head> <title>demo</title> <style type="tex

JS豌豆射手实现

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> img{ position

Android图文列表实现(ListView)

【mie haha的博客】转载请注明出处(万分感谢!):https://blog.csdn.net/qq_40315080/article/details/96186623Android中xml和java相结

分享到:

栏目导航

推荐阅读

热门阅读