防刷限流技术

防刷限流技术_第1张图片

文章目录

  • 验证码
    • 校验验证码
  • 限流
    • 限流定义
    • 限流目的
    • 限流方案
      • 限制瞬时并发数(不推荐)
      • 限制时间最大请求数
      • 令牌桶
        • 如何实现令牌桶算法
  • 防刷

验证码

防刷限流技术_第2张图片
生成验证码的代码

  • 使用生成验证码的工具生成验证码
  • 将验证码存入到redis缓存中
  • 之后下单的时候可以验证缓存中是否有


 //生成验证码
    @RequestMapping(value = "/generateverifycode",method = {RequestMethod.POST})
    @ResponseBody
    public  void  generateverifycode(HttpServletResponse response) throws BusinessException, IOException {

        //获取用户的tocken
        //根据tocken获取用户信息
        //Boolean isLogin = (Boolean) httpServletRequest.getSession().getAttribute("IS_LOGIN");
        String token = httpServletRequest.getParameterMap().get("token")[0];

        if(StringUtils.isEmpty(token)){
            throw new BusinessException(EmBusinessError.USER_NOT_LOGIN,"用户还未登陆,不能下单");
        }

        //获取用户的登陆信息
        UserModel userModel = (UserModel) redisTemplate.opsForValue().get(token);

        if(userModel == null){
            throw new BusinessException(EmBusinessError.USER_NOT_LOGIN,"用户还未登陆,不能下单");
        }


        Map<String, Object> map = CodeUtil.generateCodeAndPic();
        //将验证码存入到redis中
        redisTemplate.opsForValue().set("verify_code_"+userModel.getId(),map.get("code"));
        //设置验证号码的有效期
        redisTemplate.expire("verify_code_"+userModel.getId(),5,TimeUnit.MINUTES);

        ImageIO.write((RenderedImage)map.get("codePic"),"jpeg",response.getOutputStream());
    }

校验验证码


   //通过verifycode验证码的有效性
       String redisVerifyCode =(String) redisTemplate.opsForValue().get(redisTemplate.opsForValue().get(""));
        if(StringUtils.isEmpty(verifyCode)){
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"请求非法");
        }

        if(!redisVerifyCode.equalsIgnoreCase(verifyCode)){
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
        }

限流

限流定义

限流是对系统的出入流量进行控制,防止大流量出入,导致资源不足,系统不稳定

限流系统是对资源访问的控制组件,控制主要的两个功能:限流策略和熔断策略,对于熔断策略,不同的系统由不同的熔断策略,有的系统希望直接拒绝,有的系统希望排队等待,有的系统希望服务降级,有的系统会定制自己的熔断策略

限流目的

防刷限流技术_第3张图片

限流方案

  • 限制瞬时并发数
  • 限制时间最大请求树
  • 令牌桶算法

限制瞬时并发数(不推荐)

防刷限流技术_第4张图片

限制时间最大请求数

防刷限流技术_第5张图片

令牌桶

防刷限流技术_第6张图片
防刷限流技术_第7张图片

如何实现令牌桶算法

采用google的guavachache的


 //使用google的guava
    @Autowired
    private RateLimiter orderCreateRateLimiter;

    orderCreateRateLimiter=RateLimiter.create(300);

   if(!orderCreateRateLimiter.tryAcquire()){
                throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
            }  

防刷

在这里插入图片描述
防刷限流技术_第8张图片
防刷限流技术_第9张图片
防刷限流技术_第10张图片
防刷限流技术_第11张图片

你可能感兴趣的:(秒杀项目)