消息队列的好处
提高响应速度、解耦、稳定性(故障处理)、可扩展性、有序性、异步性。
redis实现消息队列方法1
redis有个list
类型,可以用来实现一定程度上的消息队列。
如果我们要开发一个电商网站,其中一个很重要的模块就是订单模块
(包括订单数据入库、商品库存减少 等)。
系统大一点儿(有逼格点儿),就会考虑把订单数据入库
和库存操作
分开为单独的服务,比如订单服务
里完成订单数据入口,然后调用商品服务
来完成库存操作。
如果如果订单服务
在调用商品服务
的过程中发生了意外,是否需要告诉用户下单失败?
其实库存操作和用户没有什么关系了,我们只需要在订单入口之后就通知用户下单成功。库存操作,完成可以延后执行。
这个时候,我们需要一个队列,来保存哪些订单需要执行库存操作。
#比如这样一个队列
订单5,订单4,订单3,订单2,订单1
我们的商品服务
端(可以有多个商品服务端) 来循环从这个队列中取出数据,去完成库存操作。
基本命令
lpush orders id001
lpush orders id002
从队列左边插入。
# 查看orders列表中所有数据
lrange orders 0 -1
# 弹出
127.0.0.1:6379> brpop orders 10
1) "orders"
2) "id001"
我们加入队列是从左边加的,为了保证有序性使用brpop
从右边弹出(移除)。
brpop key timeout
如果列表中没有数据,会阻塞,直到timeout
死循环从队列中取数据
上面说到我们的商品服务端
可以死循环地从队列中取出订单数据,示例代码如下:
while(true){
$res = $redis->brpop(["orders"],10);
if($res && $res[0]){
// 然后做 库存操作
echo '订单号:'.$res[1];
usleep(500*1000); // 休眠500毫秒
}else{
continue;
}
}