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

线上的一个项目,运行几个月了,用子进程方式还没有出过问题,也没挂过,相当不错

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

-EOF-

已有 6 条评论
  1. MatKili

    Viagra 50 Vademecum Cephalexin Product On Line Real Dutasteride Internet Over Night With Doctor Consult cialis with dapoxetine Side Effects Cycle Cialis Precio De Venta Zithromax Recall

    MatKili 回复
  2. StepSwesk

    Generic Dutasteride On Line Discount Mastercard Accepted Shop Viagra Et Cialis Vision buy generic cialis online Buying free shipping isotretinoin isotrex best website Alli Diet Pill Mexico Prix Levitra Marrakech

    StepSwesk 回复
  3. Austot

    Cialis Viagra Levitra Vergleich viagra cialis levitra sample pack Buy Keflex No Script Comprar Cialis Generico Linea

    Austot 回复
  4. MatKili

    Prix Du Cialis 5mg En Pharmacie viagra Generique Lioresal En France Cialis Pills Online 5mg No Prescription

    MatKili 回复
  5. StepSwesk

    Find Secure Ordering Generic Pyridium Online Ups With Free Shipping online pharmacy Levitra Action Preisvergleich Viagra Rezeptfrei

    StepSwesk 回复
  6. Austot

    Viagra Pharmacie Sans Ordonnance is alli back on the market yet 2014 Avana

    Austot 回复
发表新评论