redis list类型实现最简单的队列

消息队列的好处

提高响应速度、解耦、稳定性(故障处理)、可扩展性、有序性、异步性。

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;
    }
}

猜你喜欢

转载自blog.csdn.net/github_26672553/article/details/82841211
今日推荐