分布式限流Ridis 方案

把秒的值作为key,数值小于200就处理超出就阻塞,或丢弃。

/**
     * 1秒内最⼤1000次
     * @param key  可以设计为业务标识及接⼝标识+秒级时间戳组合。
     * @param expireMillis 过期时间60s
     * @return
     */
    public Boolean limiter(String key, Long expireMillis) {
        Long count = redisTemplate.opsForValue().increment(key, INCREMENT_STEP);
        if (1 == count) {
            redisTemplate.expire(key, expireMillis, TimeUnit.SECONDS);
        }
        if (count > 1000) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

幂等

MQ防止重复消费也可以利用INCR命令实现,如订单防重,订单5分钟之内只能被消费一次,订单号作为redis的key

 /**
     * 判断5分钟内只能消费一次
     * @param key  key
     * @param expireMillis 过期时间
     * @return
     */
    public Boolean barrier(String key, Long expireMillis) {
        Long count = redisTemplate.opsForValue().increment(key, INCREMENT_STEP);
        if (1 == count) {
            redisTemplate.expire(key, expireMillis, TimeUnit.MILLISECONDS);
        }
        if (count > 1) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

计数

我们可能常会统计网站页面每天访问量,通过incr命令在redis中设置key,每次增加1,设置24小时过期。