秒杀系统

通常的秒杀是大量的用户抢购少量的商品,类似这样的需求只需要简单的进行库存缓存,就能在实际创建订单前过滤大量的流量。
秒杀前:用户不断刷新商品详情页,页面请求达到瞬时峰值。所以可以做一个静态页面,进行倒计时;
秒杀时:秒杀页面先判断库存,再将订单存入队列,异步处理订单。
当创建订单成功,才异步通知客户端让用户进行后续的地址,优惠券信息确认,减少对数据库冲击,也过滤掉大部分的客户。一定时间内没有付款,则将货品退回库存。
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
秒杀后:用户不断刷新商品详情页,页面请求达到瞬时峰值。所以可以做一个静态页面,倒计时结束。
最好是三个状态有不同的url,防止恶意请求入侵。

redis延时队列
实时性:允许存在一定时间的秒级误差
高可用性:支持单机、支持集群
支持消息删除:业务会随时删除指定消息
消息可靠性:保证至少被消费一次
消息持久化:基于Redis自身的持久化特性,如果Redis数据丢失,意味着延迟消息的丢失,不过可以做主备和集群保证。这个可以考虑后续优化将消息持久化到MangoDB中。

  1. 用hash存储原始数据,id作为key.hmset set a1 "a1 status-0" b1 "b1 status-0" c1 "c1 status-0" d1 "d1 status-0"
  2. 将id放入其中一个zset有序列表中,以createTime+delay+priority作为score。修改状态为正在延迟中。zadd cc 30 a1 28 b1 20 c1 10 d1;hmset set a1 "a1 status-1" b1 "b1 status-1" c1 "c1 status-1" d1 "d1 status-1"
  3. 轮询zset,zrangebyscore cc min max withscores limit offset count
  4. 根据topic重新放入一个新的可消费列表(list)中,在zset中删除已经取出来的数据,并修改状态为待消费。lpop dd;hmset set a1 "a1 status-2" b1 "b1 status-2" c1 "c1 status-2" d1 "d1 status-2"
  5. 客户端获取数据只需要从可消费队列中获取就可以了。并且状态必须为待消费 运行时间需要<=当前时间的 如果不满足 重新放入zset列表中,修改状态为正在延迟。如果满足修改状态为已消费。或者直接删除元数据。lrange dd 0 10;hmset set a1 "a1 status-3" b1 "b1 status-3" c1 "c1 status-3" d1 "d1 status-3; hdel set a1;zrem cc a1;"
    在这里插入图片描述
watch num
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr num
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值