消息队列为啥用redis实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列为啥用redis实现相关的知识,希望对你有一定的参考价值。

redis只是提供一个高性能的、原子操作的分布式队列实现。具体的业务还是得需要你自己定制。
你的需求实际上是一个变形的生产者-消费者实现。对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,这跟用不用redis其实没有多大的关系。一般的实现方法是你需要将用户的请求封装成一个Task,然后将这个Task再push到redis队列,然后后端的worker.php完全可以多进程、多线程的并发处理Task并将处理结果回调给请求方。这里唯一麻烦点的就是这个Task的设计,需要能够包含请求信息(请求内容,请求方标识等等).
参考技术A

因为redis实现消息队列很简单!

$this->redis->rPush($key, $val); // 右边入
$this->redis->lPop($key);        // 左边出

本回答被提问者采纳

php redis 消息队列

redis是什么东西就不多说了,网上文章一搜一大堆。

首先来说一下我要实现的功能:

类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时方便,

而且所有的消息有优先级,也会有定时发送(如果同一时间消息过多,则会有延迟)

 

思路:

首先一个是将这两个分为两个队列来实现, 一个用来实现消息优先级,一个来实现定时发送

用的是redis的有序集合,用zadd添加时,将score比做是优先级,也可以用时间戳来当做score,用来表示时间

 

PHP 版本简易实现

将消息加入优先级的队列,将1,2替换为时间就是定时发送的队列了

1 $redis = new Redis();
2 $redis->connect(\'127.0.0.1\', 6379);
3 $redis->zAdd(\'zset1\', 1, \'message\');
4 $redis->zAdd(\'zset1\', 2, \'message2\');

从队列中取出数据

1 $redis->zRevRangeByScore(\'zset1, \'+inf\', \'-inf\', array(\'withscores\'=>false, \'limit\'=>array(0,20)));

这条语句表示从zset1这个队列里按照score从最大(+inf)到最小(-inf)的排序中取出20条,不带score,如果想要从小到大可以用  zRangeByScore

如果你想让这些都运行在命令行下,可以参考下面来,当然这些是经过删减的

复制代码
 1 <?php
 2 while (true) {
 3         $pid = pcntl_fork();
 4         if ($pid == -1) {
 5             echo date(\'Y-m-d H:i:s\') . "fork失败!\\n";
 6         } else if ($pid == 0) {
 7             $redis = new Redis();
 8             $redis->connect(\'127.0.0.1\', 6379);
 9             $redis->zRevRangeByScore(\'zset1\', \'+inf\', \'-inf\', array(\'withscores\'=>false, \'limit\'=>array(0,20)));
10             exit;
11         } else {
12             pcntl_wait($status);
13         }
14 }        
复制代码

pcntl_fork是PHP中的生成子进程,当调用该函数时,会返回一个进程pid,当pid为0时表明是在子进程中,所以把要执行的东西全放这里

以上是关于消息队列为啥用redis实现的主要内容,如果未能解决你的问题,请参考以下文章

Redis的基本使用(二) 消息队列

Redis(五)-特性-消息队列

PHP使用Redis实现消息队列

Kafka,Mq和Redis作为消息队列使用

Kafka,Mq和Redis作为消息队列使用

redis实现消息队列