商城项目---畅购chapter13(第十三天)

13-秒杀

 

1 秒杀业务分析

1.3 秒杀需求分析

秒杀技术实现核心思想是运用缓存减少数据库瞬间的访问压力!读取商品详细信息时运用缓存,当用户点击抢购时减少缓存中的库存数量,当库存数为0时或活动期结束时,同步到数据库。 产生的秒杀预订单也不会立刻写到数据库中,而是先写到缓存,当用户付款成功后再写入数据库。

当然,上面实现的思路只是一种最简单的方式,并未考虑其中一些问题,例如并发状况容易产生的问题。我们看看下面这张思路更严谨的图:

创建秒杀微服务

编写定时任务测试:

测试

定时任务分析:

时间菜单测试:

 

 

在这个秒杀数据里面因为时间是19年的,所以要筛选到符合19年的时间段的时间不可能的,所以做的适合无论怎么差都查不出来这个数据,只能在数据库里面把开始时间和结束时间的数据都修改一下,因为是多两个小时,建议划分成24个时间段,不然很容易找不到;

他这个DataUtil获取的是当前的时间,按当前时间去数据库查,是根本查不到数据的,建议大家更换时间

获取查询秒杀频道列表页,这个SpringBoot2.0每次都有登录验证的拦截,不管你发什么请求,都给你重定向到登录自己默认的登录页面,原因是只要引入了Security这个依赖,这个验证时必走的,因为后面的微服务用到的这个验证的不多,所以我看网上的很多在注解上家eclude那种方法不适用这个项目,这里我建议让启动类继承WebSecurity

重写里面的方法,或者将这段代码拷贝过去,就可以放行所有的请求,这个拦截认证真的很恶心

protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .authorizeRequests()
            .anyRequest().permitAll()
            .and().logout().permitAll();
}

获取秒杀商品的频道时间

获取秒杀商品详情数据

Service:

http://localhost:18093/seckillGoods/one?time=2020020920&id=1131814839107325952

添加秒杀:

多线程秒杀抢单:因为加了延迟时间,所以延迟之后才会往Redis里面存,而且Redis存进去之后,因为时多线程,该商品的库存和数量进行消减之后,就会从Redis里面将该订单设置支付之后,就会立即将该订单从Redis里面清楚,,这个多线程秒杀这个,还是比较实用的,消费完就立即就把自己给清除掉

下面这个时查询秒杀成功之后的状态:

Service:

如图在添加订单的时候,同时添加一个状态信息进去,这样读取的时候就可以读取到抢单成功的状态信息:最后在支付的成功的时候更新对应的Redis中的值的信息