对于秒杀服务的流程,比较耗时的是数据库的查询和数据库中数据的更新,那么可以将这两个操作通过消息队列的形式进行后期处理,关于数据查询等工作,放到redis中,这样大大加速了整个流程的实现,同时为了保证redis执行的原子性,redis的执行命令采用lua脚本的形式进行.
未优化的执行流程: (整个过程全部执行完毕才会返回响应值,这就很慢)
优化后的执行流程,将redis和tomacat分开,并行的形式处理数据
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by LP.
--- DateTime: 2023-01-17 19:19
---
--1.参数列表,优惠券id,用户id,订单id
local voucherId = AGV[1]
local userId = AGV[2]
local orderId = AGV[3]
--2.数据key 库存key, 订单key
local stockKey = 'seckill:stock:' .. voucherId
local orderKey = 'seckill:order:' .. voucherId
--3.脚本业务
--3.1判断是否库存充足
if(tonumber(redis.call('get',stockKey)) <= 0) then
return 1
end
--3.2判断用户是否已经下单
if(redis.call('sismember', orderKey, userId) == 1) then
return 2
end
--3.3扣库存
redis.call('incrby', stockKey, -1)
--3.4下单
redis.call('sadd',orderKey, userId)
--发送消息到队列中
redis.call('xadd','stream.orders','*','userId',userId,'voucherId',voucherId,'id',orderId)
return 0
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/88841.html