## 數據隊列
通過 Redis 建立數據隊列常見的有兩種方法,一是Redis 本身自帶訂閱消息隊列模型,二是使用 Redis 的 list 數據結構。本文使用 list 數據結構來演示 Redis 數據隊列功能。如果復雜的項目中還是更推薦使用 RabbitMQ 來作為數據隊列。因為 RabbitMQ 提供的數據隊列更完善,比如離線客戶端離線,服務器端會保留隊列內容,等客戶端上線后繼續處理。
將創建訂單所需數據寫入 Redis,避免高并發創建訂單給 MySQL 帶來壓力。
## 寫入隊列代碼片段
~~~
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$orders = serialize(['user_id' => 1, 'goods_id' => 1]);
$redis->lPush('ordersLists', $orders);
~~~
## 讀取隊列
異步運行`讀取隊列`代碼片段
~~~
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
while (true) {
$orders = unserialize($redis->rPop('ordersLists'));
// 寫入數據庫
// ==============
// do somthing
// ==============
if ($redis->lLen('ordersLists') == 0) {
sleep(1);
}
}
~~~
讀取隊列代碼片段可以使用 Swoole 來運行,如果讀取隊列代碼片段不涉及到多進程/多線程操作,建議使用 ThinkPHP5 自定義命令行來實現后臺常駐。