通过 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 自定义命令行来实现后台常驻。