![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
项目
云养猫v2
这个作者很懒,什么都没留下…
展开
-
项目准备
秒杀业务的特点就是:瞬间并发量大,秒杀时候会有大量用户在抢购库存量少业务简单:一般就是下订单、扣库存、支付订单最大的难点就是:秒杀活动前后,会有很多用户请求对应商品页面,会造成后台服务器的流量突增,同时对应网络带宽增加,需要控制商品页面的流量不会对后台服务器,数据库造成过大的压力。解决办法:限流:限制大部分的用户流量,只准少量用户流量进入后端服务器。削峰:将瞬间流量峰值变得平稳,...原创 2020-03-31 19:23:26 · 118 阅读 · 0 评论 -
秒杀流程
秒杀活动开始之前有个活动倒计时,时间到了则会放开秒杀的权限,并生成一个验证码展示在前面页面,并把验证结果存在redis中,这里利用redis有过期时间的特性,也给验证码的缓存加了个过期时间。这里的redis缓存用的是redis的string类型。 在秒杀之前先要填一个验证码verifyCode,点击秒杀按钮时,先发送ajax请求到后台获取真实的秒杀地址path,这里秒杀地址是隐藏的,目的是防止有...转载 2019-03-03 08:44:38 · 3199 阅读 · 5 评论 -
项目 两次MD5
第一次 (在前端加密,客户端):密码加密是(明文密码+固定盐值)生成md5用于传输,目的,由于http是明文传输,当输入密码若直接发送服务端验证,此时被截取将直接获取到明文密码,获取用户信息。加盐值是为了混淆密码,原则就是明文密码不能在网络上传输。第二次:在服务端再次加密,当获取到前端发送来的密码后。通过MD5(密码+随机盐值)再次生成密码后存入数据库。防止数据库被盗的情况下,通过md...原创 2019-02-27 09:11:21 · 211 阅读 · 0 评论 -
分布式环境下,管理Session的方式
一、session复制在支持session复制的web服务器上,通过修改web服务器配置,可以实现session同步到其它web服务器上,达到每个web服务器上都保存一致的session。适用于机器较少,网络流量较小优点:实现简单、配置较少、当网络中有机器down掉不影响用户使用。缺点:在数据量很大的情况下,不仅会占用网络资源,而且还会导致延迟适用场景:只适用于Web服务器比较...原创 2019-02-27 09:45:06 · 267 阅读 · 0 评论 -
map、json、bean之间的转换
json --> mapimport com.alibaba.fastjson.JSON;String json = "{"username":"hkdcust6.18-1", "time":"20190712104030", "sign":"50fe38ec36492f5e13bbf5a1027388ab"}";HashMap hashMap = JSON.par...原创 2019-07-12 20:13:18 · 162 阅读 · 0 评论 -
接口限流防刷
思路:对接口做限流可以使用拦截器减少对业务的侵入点击秒杀之后,首先是生成path,那假如我们对这个接口进行限制:5秒内用户只能点击5次这放在redis中是非常好实现的,因为redis自增(自减)和缓存时间功能,可以很好实现这个效果这里使用注解的方式来实现接口的限流防刷,使用注解捷克语做成通用的方法,在你想使用限流防刷的接口就可以添加该注解。思路:定义一个拦截器,...转载 2019-03-01 13:34:04 · 564 阅读 · 0 评论 -
安全优化---数学公式图形验证码
在刚刚开始秒杀的那一瞬间,迎来的并发量是最大的,数学图形验证码1. 防机器人刷按钮2. 分散用户请求思路:点击秒杀按钮之前需要输入验证码1. 生产验证码的接口2. 在获取秒杀路径的同时,验证验证码每次秒杀的时候,要先判断验证码是否正确生成数字验证码并存入redis中,判断也是从redis中取出判断...转载 2019-03-01 13:34:02 · 316 阅读 · 0 评论 -
通用缓存Key封装
public interface KeyPrefix { public int expireSeconds(); public String getPrefix();}public abstract class BasePrefix implements KeyPrefix{ private int expireSeconds; private String pref...原创 2019-02-28 09:34:31 · 426 阅读 · 0 评论 -
页面缓存、url缓存、对象缓存
页面缓存页面通用逻辑: 当用户的请求到达后端时,先去redis中查询缓存,如果缓存中找不到,则进行数据库逻辑操作,然后渲染,存入缓存并返回给前端!如果在缓存中找到了则直接返回给前段。存储在Redis缓存中的页面需要设置时间,根据数据变化是否频繁进行调整,一般都是1、2min。这种缓存一般用于不会经常变动的信息,并且访问次数比较多的页面,这样就不用每次都动态加载了。...转载 2019-03-01 13:33:53 · 522 阅读 · 0 评论 -
页面静态化、前后端分离(页面优化)
页面静态化: 利用浏览器缓存我们的页面。因此我们的页面要保证是纯静态的页面,与后端的数据交互都要通过ajax来获取数据。之前的逻辑:现在的逻辑:大概:将页面缓存到客户端的浏览器上,当用户访问页面的时候,直接不与服务器有交互,直接从本地缓存(浏览器)中拿页面,节省网络流量。之前的逻辑:点击链接,访问后端controller访问业务层,成功获取数据,将数据渲染...转载 2019-03-01 13:33:55 · 2280 阅读 · 1 评论 -
接口优化---Redis预减库存,内存标记
Redis预减库存:主要思路是减少对数据库的访问,之前的减库存,直接访问数据库,读取库存,当高并发请求到来时,大量的读取数据有可能会导致数据库的崩溃。秒杀接口优化思路:系统初始化时,将商品库存加载到Redis缓存中保存 收到请求的时候,先在Redis中拿到该商品的库存值,进行库存预减,如果减完之后库存不足直接返回逻辑Exception,就不需要访问数据库再去减库存了,如果库存值正确,进行...转载 2019-03-01 13:33:57 · 2096 阅读 · 2 评论 -
接口优化--Rabbit MQ异步下单
项目使用Direct模式思路:1. 当确认秒杀时,(库存充足,且无重复秒杀)将秒杀请求需要消息入队,同时给前段返回一个code(0) 前端接收到数据后,显示排队中。2. 后端Rabbit MQ监听秒杀queue的这名字的通道,如果有消息过来,获取传入的信息,执行真正的秒杀之前,要判断数据库的库存,之前判断的是Redis的库存,判断是否重复秒杀,然后执行miaoshaService...转载 2019-03-01 13:33:59 · 530 阅读 · 0 评论 -
安全优化---秒杀地址的隐藏
每次点击秒杀按钮,才会生成秒杀地址,之前是不知道秒杀地址的。不是写死的,是从服务端获取,动态拼接而成的地址。思路:1. 在进行秒杀前,先请求一个服务端地址,/getmiaoshaPath这个地址,用来获取秒杀地址,传参为商品id,在服务端生成随机数(MD5)作为pathid存入缓存,(缓存过期时间60s),r然后将这个随机数返回给前端。2. 获得该pathid后,前端在用这个pat...转载 2019-03-01 13:34:00 · 567 阅读 · 2 评论 -
超卖问题解决
本项目超卖有两种:1. 不同用户在读请求的时候,发现商品库存足够,然后同时发起请求,进行秒杀操作,减库存,导致库存减为负数。2. 同一用户在有库存的时候,连续发出多个请求,两个请求同时存在,于是生成了多个订单。对于第二种:可以在数据库里将用户id和商品id加上唯一索引。对于第一种:1. 最简单的方法,更新数据库减库存的时候,进行库存限制条件。 and stock_co...原创 2019-02-27 19:16:31 · 5604 阅读 · 2 评论