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

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐