redis实现有序的消息队列

Posted IT女的杂货铺

tags:

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




点击“蓝色”关注

DongLinXiaAn


redis实现有序的消息队列


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

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

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

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

 

思路:

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

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

 

php 版本简易实现

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

 

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

从队列中取出数据

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

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

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


<?php
   while (true) {        
      $pid = pcntl_fork();
        if ($pid == -1) {
            echo date('Y-m-d H:i:s') . "fork失败!\n";
        } else if ($pid == 0) {
            $redis = new Redis();
            $redis->connect('127.0.0.1', 6379);
            $redis->zRevRangeByScore('zset1', '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,20)));
            exit;
        } else {
            pcntl_wait($status);
       }
}


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



以爱与青春为名,陪你一路成长

不失初心,不忘初衷

你不来,我不走

DongLinXiaAn

新浪微博:@冬临夏安



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

Redis 实现消息队列 MQ

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

php+redis简易消息队列

php redis 消息队列

PHP + Redis 实现消息队列

消息队列--1--Redis