做法

使用redis的lua脚本功能来限频

在redis中定时刷新系统时间来作为一个全局的时钟

限频脚本:

	/**
* 获取令牌的lua脚本
*/
public final static String SCRIPT = "local epoch = redis.call(\"hget\",KEYS[1],'Epoch');\n" +
"local currentEpoch = tonumber(ARGV[1]);\n" +
"if(epoch == false and currentEpoch ~= epoch) then\n" +
" redis.call('hset', KEYS[1], 'Epoch',currentEpoch);\n" +
" redis.call(\"hset\", KEYS[1], 'Count', tonumber(ARGV[2]));\n" +
" redis.call('pexpire', KEYS[1], 2000);\n" +
" return 1;\n" +
"end; \n" +
"local currentCount = redis.call(\"HINCRBY\", KEYS[1],'Count', tonumber(ARGV[3]));\n" +
"if(currentCount > 0) then \n" +
" return 1;\n" +
"else \n" +
" return 2;\n" +
"end;"; /**
* 同步系统时间到redis 中的lua脚本
*/
public final static String SET_SYSTEM_TIME_SCRIPT = "local clientId = redis.call(\"hget\",KEYS[1],'Client'); \n" +
"if (clientId == false or clientId == ARGV[1]) then \n" +
" redis.call('hset', KEYS[1], 'Client', ARGV[1]);\n" +
" redis.call('hset', KEYS[1], 'Time' ,ARGV[2]);\n" +
" redis.call('pexpire', KEYS[1], tonumber(ARGV[3]));\n" +
" return 1;\n" +
"end;\n" +
"return 2;";

java调用代码:

  List<String> keys = new ArrayList<String>();
keys.add("JRateLimit-Key-" + source); List<String> args = new ArrayList<String>();
args.add(currentEpoch + ""); //currentEpoch是通过获取全局时钟来做的
args.add(permitsPerEpoch + "");
args.add((0 - permits) + ""); Object result = client.evalsha(LIMIT_LUA_SCRIPT_SHA, keys, args, false); //result的类型即为lua脚本中的返回值类型,Long

策略

通过redis实现全局时钟

通过一次多取几个令牌放到内存中来解决超大调用频率导致的redis请求单机ops极限问题

redis限频的更多相关文章

  1. 性能提速:debounce(防抖)、throttle(节流/限频)

    debounce与throttle是用户交互处理中常用到的性能提速方案,debounce用来实现防抖动,throttle用来实现节流(限频).那么这两个方法到底是什么(what)?为何要用(why-解 ...

  2. 使用nginx构建限频、限速、限并发的应用保护层

    使用nginx构建限频.限速.限并发的应用保护层 nginx本身提供了基础的限频.限速.限并发连接等能力. 限频 基于uri等限制某一个客户端,某类客户端持续时间段内建立连接的次数. 限速 限制客户端 ...

  3. Redis限流

    在电商开发过程中,我们很多地方需要做限流,有的是从Nginx上面做限流,有的是从代码层面限流等,这里我们就是从代码层面用Redis计数器做限流,这里我们用C#语言来编写,且用特性(过滤器,拦截器)的形 ...

  4. 【spring cloud】对接口调用者提供API使用的安全验证微服务【这里仅通过代码展示一种设计思想】【后续可以加入redis限流的功能,某段时间某个IP可以访问API几次】

    场景: 公司的微服务集群,有些API 会对外提供接口,供其他厂商进行调用.这些公开的API接口,由一个OpenAPI微服务统一提供给大家. 那么所有的调用者在调用公开API接口的时候,需要验证是否有权 ...

  5. Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用

    Redis中的HyperLogLog 一般我们评估一个网站的访问量,有几个主要的参数: pv,Page View,网页的浏览量 uv,User View,访问的用户 一般来说,pv 或者 uv 的统计 ...

  6. 基于kubernetes的分布式限流

    做为一个数据上报系统,随着接入量越来越大,由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机 ...

  7. 分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket

    业务背景介绍 对于web应用的限流,光看标题,似乎过于抽象,难以理解,那我们还是以具体的某一个应用场景来引入这个话题吧. 在日常生活中,我们肯定收到过不少不少这样的短信,“双11约吗?,千款….”,“ ...

  8. stackExchange.redis 实现模糊匹配批量查询

    如果使用redis的频次较高,那么业务中经常会出现需要根据关键字进行批量查询,所以总结一下StackExchange中使用批量查询的方法(如果数据量很大,那么在redis中模糊查询很耗时,请慎用!) ...

  9. spring cloud gateway(三、实现限流)

    限流一般有两个实现方式,令牌桶和漏桶 金牌桶是初始化令牌(容器)的个数,通过拿走里边的令牌就能通过, 没有令牌不能报错,可以设置向容器中增加令牌的速度和最大个数 漏桶是向里边放入请求,当请求数量达到最 ...

随机推荐

  1. 3.Channel详解

  2. 快速上手spring

    一.初始程序 1.在父类pom导入所需要的jar包 2.编写一个实体类 3.创建一个beans.xml,创建一个bean即创建一个user对象,可在bean内配置property即设置属性值 4.用测 ...

  3. 搜索引擎学习(三)Lucene查询索引

    一.查询理论 创建查询:构建一个包含了文档域和语汇单元的文档查询对象.(例:fileName:lucene) 查询过程:根据查询对象的条件,在索引中找出相应的term,然后根据term找到对应的文档i ...

  4. [LCTF]bestphp's revenge 给我的启发学习

    bestphp's revenge flag.php: only localhost can get flag!sessionstart(); echo 'only localhost can get ...

  5. 图形渲染的大致过程和关于OpenGL渲染管线的一些零碎知识,openglpipeline,vao,vbo,ebo.

    重要!!! OpenGL新人一枚,希望可以再此和大家分享有用的知识,少走弯路 文章会定期更新,把前面几段已经整理过的知识更完后,接下来每周至少会更两次. 文章如果有不对的,理解错误的地方,也非常希望在 ...

  6. spring的AspectJ基于XML和注解(前置、后置、环绕、抛出异常、最终通知)

    1.概念 (1)AspectJ是一个基于Java语言的AOP框架 (2)Spring2.0以后新增了对AspectJ切入点表达式的支持 (3)AspectJ是AspectJ1.5的新增功能,通过JDK ...

  7. Centos-归档文件或目录-tar

    tar 对文件或者目录进行打包归档成一个文件,不是压缩 相关选项 -c 新建文件 -r 将目标文件追加都档案文件末尾 -t 列出归档文件中已经归档文件列表 -x 从归档文件中还原文件 -u 新文件更新 ...

  8. 协同过滤 Collaborative Filtering

    协同过滤 collaborative filtering 人以类聚,物以群分 相似度 1. Jaccard 相似度 定义为两个集合的交并比: Jaccard 距离,定义为 1 - J(A, B),衡量 ...

  9. ESD(静电释放)上半部分

    ESD(静电释放)上半部分 ESD:Electro-Static discharge静电释放 1.ESD静电释放的模式 1.1 人体放电模式(human body mode) 人体会释放静电,那么人体 ...

  10. Java知识系统回顾整理01基础06数组02初始化数组

    一.分配空间与赋值分步进行 分配空间与赋值分步进行 public class HelloWorld { public static void main(String[] args) { int[] a ...