时间窗口限流算法,基于redis的zset数据结构完成

public ResponseResult login(LoginDto loginDto) {

    /**\
     * 如果用户名与密码存在则进行正常登录
     */
    if(StringUtils.isNotBlank(loginDto.getPhone()) && StringUtils.isNotBlank(loginDto.getPassword())){

        //1.查看是否达到限流阈值(5分钟之内3次请求)
        //先对5分钟之前推积的无用数据进行清除
        long timestamp = System.currentTimeMillis() - (5 * 60 * 1000); // 五分钟前的时间戳

        cacheService.zRemoveRangeByScore("User:Login:"+loginDto.getPhone(),Double.NEGATIVE_INFINITY,timestamp);

        System.err.println("当前五分钟之前的时间戳"+timestamp);

        //查询5分钟之内的数据
        Set<String> strings = cacheService.zReverseRangeByScore("User:Login:" + loginDto.getPhone(), timestamp, new Date().getTime());
        if(strings.size()<3){
            cacheService.zAdd("User:Login:"+loginDto.getPhone(), String.valueOf(new Date().getTime()),new Date().getTime());
        }else{
            return ResponseResult.errorResult(AppHttpCodeEnum.NO_OPERATOR_AUTH,"当前登录次数过多,请于一分钟后重试");
        }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值