redis实现有序的消息队列

redis是什么东西就很少说了,网上文章一搜一大堆。php

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

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

并且全部的消息有优先级,也会有定时发送(若是同一时间消息过多,则会有延迟)spa

 

思路:命令行

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

用的是redis的有序集合,用zadd添加时,将score比作是优先级,也能够用时间戳来当作score,用来表示时间blog

 

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时代表是在子进程中,因此把要执行的东西全放这里

线上的一个项目,运行几个月了,用子进程方式尚未出过问题,也没挂过,至关不错

ps:好长时间不写博客了,我感受好难写啊,之后要坚持每周都要写至少一篇,并且不能是之前那种凑数的

 

-EOF-

相关文章
相关标签/搜索