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-