redis實現有序的訊息佇列

2021-07-13 07:02:01 字數 1001 閱讀 7548

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

2while (true

) else

if ($pid == 0) else

14 }

pcntl_fork是php中的生成子程序,當呼叫該函式時,會返回乙個程序pid,當pid為0時表明是在子程序中,所以把要執行的東西全放這裡

redis實現訊息佇列

用redis實現乙個訊息通知系統,總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。記憶體 比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所以如果只...

redis實現訊息佇列

模擬生產者 消費者 生產者 往list資料型別中放入key為product的資料 public static void main string args 消費者 使用堵塞命令實時獲取product的資料 public static void main string args catch except...

redis 實現訊息佇列

redis 實現訊息佇列 測試 component public class timetask object obj null for int i 0 i 10 i 封裝redis工具類 slf4j component public class redisutil catch exception e...