前言
某個產品 或者訂單,有個有效期 過了有效期要取消
方法一 : 寫個指令碼,用crontab 定時掃瞄 改變狀態 但是最低只能一分鐘 ,不適合
方法二 : 用swoole得毫秒定時器,每秒鐘去掃瞄表 明顯占用資源 mysql受不了
方法三 :用rabbitmq延時佇列 一開始將其丟入mq 死信佇列,設定有效期,過時**到其他佇列,再啟動乙個消費者 消費 更改表狀態
php 安裝mq擴充套件
搭建mq服務
建立生產者和消費者
生產者 publish.php
header(『content-type:text/html;charset=utf8;『);
$time = 30;
$params = array(
『exchangename『 => 『test_cache_exchange『."_".$time,
『queuename『 => 『test_cache_queue『."_".$time,
『routekey『 => 『test_cache_route『."_".$time,
$connectconfig = array(
『host『 => 『127.0.0.1『,
『port『 => 5672,
『login『 => 『admin『,
『password『 => 『password『,
『vhost『 => 『/『
//var_dump(extension_loaded(『amqp『));
//exit();
try catch(exception $e) catch (exception$e) else else {
//echo『messagenotfound『.php_eol;
執行推送 我改了不同時間推送,會生成不同的交換機 路由 佇列,因為我用得是direct型別 要一一匹配
消費者開啟
[root@localhost mq]# php consumer.php
2020-07-18 11:07:22--失效時間 2020-07-18 11:07:42
2020-07-18 11:07:22--失效時間 2020-07-18 11:07:42
2020-07-18 11:07:23--失效時間 2020-07-18 11:07:43
2020-07-18 11:07:23--失效時間 2020-07-18 11:07:43
2020-07-18 11:13:04--失效時間 2020-07-18 11:13:24
2020-07-18 11:21:00--失效時間 2020-07-18 11:21:10
2020-07-18 11:21:32--失效時間 2020-07-18 11:22:02
2020-07-18 11:21:32--失效時間 2020-07-18 11:22:02
2020-07-18 11:21:22--失效時間 2020-07-18 11:22:12
2020-07-18 11:21:23--失效時間 2020-07-18 11:22:13
2020-07-18 11:21:23--失效時間 2020-07-18 11:22:13
發現正常,都是我設定的事件過期後就到處理佇列,在這裡消費,處理邏輯即可
參考
Redis 延時佇列
延時佇列可以通過 redis 的 zset 有序列表 來實現。我們將訊息序列化成乙個字串作為 zset 的 value,這個訊息的到期處理時間作為 score,然後用多個執行緒輪詢 zset 獲取到期的任務進行處理,多個執行緒是為了保障可用性,萬一掛了乙個執行緒還有其它執行緒可以繼續處理。因為有多個...
redis 佇列 redis 延時佇列
定時發公告 使用者下單30分鐘後未付款自動關閉訂單 使用者下單後延時簡訊提醒 延時關閉空閒客戶端連線 使用redis提供的有序資料結構zset,把過期時間戳作為score。public void produce string topic,string msg,date date 生產訊息 於 消費 ...
RabbitMQ實現延時佇列
rabbitmq實現延時佇列一般有兩種形式 第一種方式 利用兩個特性 time to live ttl dead letter exchanges dlx a訊息佇列過期 傳送給b佇列 第二種方式 利用rabbitmq的外掛程式x delay message rabbitmq可以針對佇列設定x ex...