美文网首页
redis实现秒杀

redis实现秒杀

作者: 谦业 | 来源:发表于2019-01-31 17:33 被阅读0次

    秒杀活动
    内容
    实现简单的秒杀页面(显示当前秒杀活动状态)和秒杀接口,不需要考虑下订单和退货流程。
    秒杀接口要求
    时间到了才能开始秒杀
    不能超买:1个用户只能秒杀1次
    不能超卖
    在缓存崩溃重启的情况也不能出现超买和超卖的情况

    测试
    功能正常
    1个用户发起100个并发测试
    随机用户(userId:rand(1, 1000000000)) 请求,100个并发秒杀,最先完成秒杀1000个商品的活动

    数据表结构如下

    --
    -- 用户秒杀成功记录 `log`
    --
    CREATE TABLE `log` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `eventId` int(11) NOT NULL COMMENT '活动ID',
      `userId` int(11) NOT NULL COMMENT '用户ID',
      `createTime` int(11) NOT NULL COMMENT '创建时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `eventId` (`eventId`,`userId`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4353 DEFAULT CHARSET=utf8;
    
    
    
    --
    -- 秒杀活动 `event`
    --
    CREATE TABLE `event` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cnt` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '总量',
      `remainCnt` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '剩余数量',
      `startTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '开始时间',
      `createTime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='活动';
    

    实现思路:
    1.被动缓存商品库存——redis读取库存,不存在则从数据库内读取活动数据,并缓存库存信息
    2.对用户加锁以避免重复抢购,设置过期时间
    3.用户加锁成功,再查该用户的购买记录,验证
    4.利用redis的decr扣库存,返回接口<0,则操作失败,表明库存已耗尽
    5.mysql减库存并记录日志,注意减库存操作加上验证条件remainCnt>0,已避免redis崩溃穿透导致超卖
    代码:https://github.com/Alexchent/interview/tree/master/codehero2

    相关文章

      网友评论

          本文标题:redis实现秒杀

          本文链接:https://www.haomeiwen.com/subject/yphlsqtx.html