经常会遇到一些像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";
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐