Redis实现滑动窗口功能

经常会遇到一些像X时间登陆y次,或者接口防刷这样的需求,redis可以提供很好的支持,只要是使用redis中zset结构的count(key, min,max)方法,若设置min为当前时间减去x,max取值为当前时间,就可以算出当前近x秒内,redis中存储了多少个这样的数据。
public String test() {
        // time秒内只能访问接口co次
        int time = 10;
        int co = 3;
        Long currentTime = new Date().getTime();
        redisTemplate.hasKey("limit");
        Integer count1 = null;
        Long count = null;
        if (redisTemplate.hasKey("limit")) {
            // 方法一
//            count1 = redisTemplate.opsForZSet().rangeByScore("limit", currentTime - time*1000, currentTime).size();        // intervalTime是限流的时间
            // 方法二
            count = redisTemplate.opsForZSet().count("limit", currentTime - time * 1000, currentTime);
            if (count != null && count > co) {
                return  "error 超出次数";
            }
        }
        redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(),currentTime);
        // 设置过期时间,时长为time的两倍
        redisTemplate.expire("limit",time*2, TimeUnit.SECONDS);
        return "ok";
    }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值