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-

相關文章
相關標籤/搜索