栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot使用Redis-Cell实现限流

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot使用Redis-Cell实现限流

一、Redis-Cell安装如下

Redis-Cell限流插件安装(Centos)_毅呀毅呀哟-CSDN博客一、下载wget https://github.com/brandur/redis-cell/releases/download/v0.3.0/redis-cell-v0.3.0-x86_64-unknown-linux-gnu.tar.gz二、解压tar -zxvf redis-cell-v0.3.0-x86_64-unknown-linux-gnu.tar.gz三、得到如下四、复制.so文件的地址,在redis.conf文件中添加如下配置loadmodule /usr/l.https://blog.csdn.net/qq_39648029/article/details/121245348二、Redis-Cell指令介绍

CL.THROTTLE user123 15 30 60 1

 三、返回值

127.0.0.1:6379> CL.THROTTLE user123 15 30 60
1) (integer) 0     # 0允许,1拒绝
2) (integer) 16    # 容量,等于指令第二个参数 +1 
3) (integer) 15    # 剩余量
4) (integer) -1    #-1表示正常放入,0表示已满,正数表示几秒可放入(单位:秒)
5) (integer) 2     # 多长时间漏斗完全漏空(单位:秒)

四、spring boot代码

package com.zyweb.admin.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisscript;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    private final Logger logger = LoggerFactory.getLogger(RedisUtil.class);

    @Resource
    private RedisTemplate redisTemplate;

    
    public static final String LUA_script = "return redis.call('cl.throttle',KEYS[1], ARGV[1], ARGV[2], ARGV[3], ARGV[4])";
    
    
    public boolean redisCellDemo(String key, int maxBurst, int countPerPeriod, int period, int quantity) {
        try {
            DefaultRedisscript script = new DefaultRedisscript<>(LUA_script, List.class);
            
            List rst = redisTemplate.execute(script, Arrays.asList(key), maxBurst, countPerPeriod, period, quantity);
            logger.info("限流{}返回:{}", key, rst);
            
            //这里只关注第一个元素0表示正常,1表示过载
            return rst.get(0) == 0;
        } catch (Exception e) {
            logger.error("限流{}获取抛错:", key, e);
            return false;
        }
    }
}

 五、测试

    @GetMapping("/redisCell")
    public void redisCell(){
        // 模拟30次请求
        for (int i = 0; i < 30; i++) {
            boolean rst = redisUtil.redisCellDemo("user123 ", 5, 10, 30, 1);
            if (!rst) {
                logger.info("访问{}过于频繁,请稍后再试",i);
            } else {
                logger.info("访问{}通过",i);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

六、demo表示,每秒有1个请求进入,漏斗最大容量为5,漏水速率为10个/30秒,也就是3秒钟漏掉一个

整合拦截器+自定义注解,可自定义对接口进行限流

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459947.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号