Redis秒杀
  RuXuq8CpAyRj 2023年11月02日 28 0
全局ID生成器

当用户抢购时,就会生成订单并保存到订单这张表中,而订单表如果使用数据库自增ID就存在一些问题 :

●id的规律性太明显,用户可以进行猜测

●受单表数据量的限制

全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:

●唯一性

●高可用

●高性能

●递增性

●安全性

Redis秒杀_秒杀

public long nextId(String keyPrefix) {
    // 1.生成时间戳
    LocalDateTime now = LocalDateTime.now();
    long nowSecond = now.toEpochSecond(ZoneOffset.UTC);
    long timestamp = nowSecond - BEGIN_TIMESTAMP;

    // 2.生成序列号
    // 2.1.获取当前日期,精确到天
    String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
    // 2.2.自增长
    long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);

    // 3.拼接并返回
    return timestamp << COUNT_BITS | count;
}

全局唯一ID生成策略:

●UUID

●Redis自增

●snowflake算法

●数据库自增

Redis全局ID生成策略

●每天一个key,方便统计订单量

●ID构造是时间戳+计数器


实现优惠券秒杀的下单功能

下单时需要判断两点:

●秒杀是否开始或结束,如果尚未开始或已经结束则无法下单

●库存是否充足,不足则无法下单

Redis秒杀_生成器_02


乐观锁解决超卖问题

乐观锁的关键是判断之前查询得到的数据是否有被修改过

Redis秒杀_乐观锁_03

乐观锁SQL(更新数据时用

update goods set set stock = stock - 1 where voucher_id = 1 and stock > 0

超卖这样的线程安全问题,解决方案有哪些?

1.悲观锁:添加同步锁,让线程串行执行

优点:简单粗暴

缺点:性能一般

2.乐观锁: 不加锁,在更新时判断是否有其它线程在修改

优点:性能好

缺点:存在成功率低的问题

一人一单(分布式锁)

需求:修改秒杀业务,要求同一个优惠券,一个用户只能下一单

Redis秒杀_秒杀_04

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
RuXuq8CpAyRj