springboot-seckill
springboot-seckill copied to clipboard
:racehorse:基于SpringBoot + MySQL + Redis + RabbitMQ + Guava开发的高并发商品限时秒杀系统
大佬,想问你一个问题,你这里为什么没有去实现隐藏秒杀地址的功能,你觉得这个没必要吗,希望你能解答一下
明明这个用户的信息已经在数据库里面了啊。。。。。。。
运行报错: Description: Field userMapper in com.jesper.seckill.service.UserService required a bean of type 'com.jesper.seckill.mapper.UserMapper' that could not be found. Action: Consider defining a bean of type 'com.jesper.seckill.mapper.UserMapper' in your configuration.
数据什么的都导入了。该安装的也安装了。启动后也没报错。 但是访问localhost:8080一直都404加上/login啥的也是404.想问下大佬是怎么回事
关于乐观锁
本人小白,mysql的update本身具有排他锁,@Update("update sk_goods_seckill set stock_count = stock_count - 1, version= version + 1 where goods_id = #{goodsId} and stock_count > 0 and version = #{version}"),更新库存应该不存在安全问题,为什么还需要根据版本来实现乐观锁,希望释疑。
同一个商品减库存key为SeckillKey:go1,失败一次,则后续所有该商品的所有减库存操作在redis中设为失败,一旦getSeckillResult查询时,mq暂时没执行则会通知秒杀失败。"对不起,秒杀失败" ,即一直失败 建议rediskey添加用户id,并给这个key设置过期时间,即超过最大mq延迟执行时间
用户密码
你好,我想运行这个项目,密码可以说下吗
应用启动时获取秒杀记录的乐观锁存根,在每次更改秒杀记录成功后,修改存根中的记录。 重新设计订单表。 insertSeckillOrder 返回插入主键,选择使用@Option 注解,结果可以从传入对象本身获取。
GoodsService.reduceStock()这个方法,外层调用方法是有事务的。 MYSQL默认的事务隔离级别是可重复读。就是在事务中的同一个数据,前后读取值一样不变。就是利用的MVCC多版本控制实现的。 goodsMapper.getVersionByGoodsId(goods.getId())获取最新版本号这个方法由于事务MVCC控制关系,只能查询到小于等于此事务版本的数据。在事务中,查询多少次都获取不到更新的version,无论重试多少次,扣库存永远失败。 改进,应该把重试拿到事务外层来。 我实践测试下来,改动前,50个商品秒杀,消息队列放进来了50个消息,但是成功秒杀只有7个订单。 改进后,50个消息,但是成功秒杀50个订单。