PHP Redis 實現簡單訊息佇列

2021-10-04 22:55:36 字數 2675 閱讀 4944

redis做訊息佇列的好處在於它的輕量級,高併發,延遲敏感,應用場景有 即時資料分析、秒殺計數器、快取等

redis做訊息佇列待解決的問題:

1、訊息的可靠性: 沒有相應的機制保證訊息的消費,當消費者消費失敗的時候,訊息體丟失,需要手動處理。生產者只管向佇列中插入資料,不管消費者是否成功消費。

2、消費者掛掉訊息不會丟失,但是需要重新觸發一下消費者,才能夠繼續消費訊息。

**如下:

lib.php是工具檔案,裡面有資料庫的連線、redis的連線:

<?php

/** * 獲取資料庫連線

* * @param $host

* @param $username

* @param $password

* @param $database

* @return mysqli

*/function getdbconnection($host, $username, $password, $database)

mysqli_query($connection, "set names 'utf8'");

return $connection;}

/** * 獲取redis連線

* * @param $host

* @param $port

* @param string $password

* @param int $database

* @return redis

*/function getredis($host='127.0.0.1', $port='6379', $password=null, $database=0)

if(!empty($password) && !$redis->auth($password))

if($database)

// work中 subscribe 如果一段時間沒有接到訊息,就會停掉然後停掉,所以加這個語句讓其永不超時

$redis->setoption(redis::opt_read_timeout, -1);

return $redis;}

/** * 列印訊息日誌

* * @param $msg

*/function stdout($msg=null)

register.php是訊息發布者,注釋的是將訊息存入資料庫部分的**。

首先想訊息存入 register_users 佇列中,存入的 key是register_users;value是乙個list,訊息全部存入其中。用 redis-cli 檢視資料的命令是:

lrange register_users 0 -1
register.php:

<?php

require './lib.php';

$name = $ar**[1];

$mobile = $ar**[2];

if(empty($name) || empty($mobile))

// $connection = getdbconnection('localhost:3306', 'root', 'root', 'blog');

// // 開啟事務

// mysqli_begin_transaction($connection);

// $sql = "insert into mq_user(name, mobile) values ('$name', '$mobile')";

// if(!mysqli_query($connection, $sql))

$redis = getredis();

// 新增訊息

$result = $redis->lpush('register_users', json_encode(array('name'=>$name, 'mobile'=>$mobile), json_unescaped_unicode));

if($result === false)

// 發布訊息

$redis->publish('register_success', 'ok');

// 所有操作完成後提交事務

// mysqli_commit($connection);

// $connection->close();

$redis->close();

work.php做為訊息的消費者

<?php

require './lib.php';

$redis = getredis();

$redis->subscribe(['register_success'], function ($instance, $channelname, $message) }}

});

register.php將訊息放入redis 的 register_users佇列中,然後再使用 publish 將 register_success 訊息發不出去。work.php 使用 subscribe 訂閱register_success 的訊息。接收到 register_success 訊息之後,讀取 register_users 的訊息進行處理。

php redis實現簡單的訊息佇列

redis redis是乙個開源,高階的鍵值儲存和乙個適用的解決方案,用於構建高效能,可擴充套件的web應用程式。redis有三個主要特點,使它優越於其它鍵值資料儲存系統 redis支援的資料型別有 stirng 字串 list 列表 hash 字典 set 集合 sorted set 有序集合 r...

php redis實現訊息佇列

參考 參考 訊息佇列 是在訊息的傳輸過程中儲存訊息的容器。訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞 如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它 應用場景 非同步處理,應用解耦,流量削鋒和訊息通訊四個場景 1 非同步處...

php redis實現訊息佇列

個人理解在專案中使用訊息佇列一般是有如下幾個原因 把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力 實現資料順序排列獲取 redis實現訊息佇列步驟如下 1 redis函式rpush,lpop 2 建議定時任務入佇列 3 建立定時任務出佇列 檔案 demo.php插入資料到redis佇列 re...