美文网首页微服务架构和实践架构
限流组件的实现思路-(第一版)

限流组件的实现思路-(第一版)

作者: 罗曼蒂克 | 来源:发表于2019-07-01 20:55 被阅读2次

借助 redis,
根据业务设计唯一的 key.
使用配置参数(一定时间内可发送的次数)count作为 value
使用配置参数(时间)作为该 key的过期时间.

逻辑:
每次发送时检查是否存在该 key,和次数是否达到上限,已达上限不发送;
如果不存在或者未达上限,则发送,然后 count++,同时更新过期时间

ps:
关于过期时间有两点歧义:是否需要续期,因此做成了可配置的.



public class LimitService {
    private final String value = "value";
    private final String createTime = "create_time";
    Jedis jedis;

    @Before
    public void before() {
        jedis = new Jedis("localhost");
    }

    @Test
    public void test() {
        execute();
    }

    private static final int count=2;
    private static final int second=10;
    //数值变化更新有效期
    private static final boolean INCREASE_VALUE_REFRESH_TTL = false;

    private static final String key = "limit_component";

    public void execute() {
        if (check()) {
            System.out.println("执行方法");
        }
    }

    private boolean check() {
        boolean result ;
        int currentCount=0;
        if (!jedis.exists(key)) {
            result = true;
            setKey(currentCount);
        } else {
            String s = jedis.hget(key, value);
            currentCount= Convert.toInt(s);
            if (currentCount >= count) {
                //大于等于超限啦
                result = false;
            } else {
                result = true;
                setKey(currentCount);
            }
        }
        System.out.println(StrUtil.format("检查结果【{}】",result));
        return result;
    }

    private void setKey(int currentCount) {
        currentCount++;
        Boolean exists = jedis.exists(key);
        jedis.hset(key, value, Convert.toStr(currentCount));
        if (INCREASE_VALUE_REFRESH_TTL ||!exists) {
            //续期
            jedis.expire(key, second);
            if (!exists) {
                jedis.hset(key, createTime, Convert.toStr(System.currentTimeMillis()));
            }
        }
    }


}

后边会考虑使用注解来定义配置项

相关文章

  • 限流组件的实现思路-(第一版)

    借助 redis,根据业务设计唯一的 key.使用配置参数(一定时间内可发送的次数)count作为 value使用...

  • 弹幕组件(一)

    弹幕组件 弹幕组件实现主要为DOM或Canvas实现。主要涉及基本思路。 弹幕组件的设计 弹幕组件可以基本拆分为背...

  • 微信爬虫实战

    目录 原理难点思路实现 实战代理微信抓取 经验 原理 难点 可用接口 突破鉴权 验证限流 思路 搜狗微信 典型的开...

  • Flutter实现左右抖动动画效果

    先看效果: 实现思路: 使用AnimationBuilder配合Transform.translate组件,实现显...

  • Flutter组件化

    使用Flutter Module实现组件化的思路:Flutter组件化[https://juejin.cn/pos...

  • Vue echarts

    安装 echarts 图表组件实现组件主要思路 安装 echarts 图表组件 如果经常使用图表,则可以封装一个 ...

  • PHP中接口限流实现

    代码中实现单个用户限流,uid换为接口名,即可实现接口限流

  • vue中阻止粘贴的实现

    需求: 阻止element组件中的的粘贴功能 实现思路: 组件是由外层...

  • 【react】父子组件之间通讯props

    实现父子组件双向数据流整体的思路是: 1,父组件可以向子组件传递props,props中带有初始化子组件的数据,还...

  • 限流降级方案

    限流算法 并发数限流 计数器并发数限流:使用共享变量实现 信号量:使用java中的Semaphore QPS限流 ...

网友评论

    本文标题:限流组件的实现思路-(第一版)

    本文链接:https://www.haomeiwen.com/subject/ctvncctx.html