redis限频
做法
使用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限频的更多相关文章
- 性能提速:debounce(防抖)、throttle(节流/限频)
debounce与throttle是用户交互处理中常用到的性能提速方案,debounce用来实现防抖动,throttle用来实现节流(限频).那么这两个方法到底是什么(what)?为何要用(why-解 ...
- 使用nginx构建限频、限速、限并发的应用保护层
使用nginx构建限频.限速.限并发的应用保护层 nginx本身提供了基础的限频.限速.限并发连接等能力. 限频 基于uri等限制某一个客户端,某类客户端持续时间段内建立连接的次数. 限速 限制客户端 ...
- Redis限流
在电商开发过程中,我们很多地方需要做限流,有的是从Nginx上面做限流,有的是从代码层面限流等,这里我们就是从代码层面用Redis计数器做限流,这里我们用C#语言来编写,且用特性(过滤器,拦截器)的形 ...
- 【spring cloud】对接口调用者提供API使用的安全验证微服务【这里仅通过代码展示一种设计思想】【后续可以加入redis限流的功能,某段时间某个IP可以访问API几次】
场景: 公司的微服务集群,有些API 会对外提供接口,供其他厂商进行调用.这些公开的API接口,由一个OpenAPI微服务统一提供给大家. 那么所有的调用者在调用公开API接口的时候,需要验证是否有权 ...
- Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用
Redis中的HyperLogLog 一般我们评估一个网站的访问量,有几个主要的参数: pv,Page View,网页的浏览量 uv,User View,访问的用户 一般来说,pv 或者 uv 的统计 ...
- 基于kubernetes的分布式限流
做为一个数据上报系统,随着接入量越来越大,由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机 ...
- 分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket
业务背景介绍 对于web应用的限流,光看标题,似乎过于抽象,难以理解,那我们还是以具体的某一个应用场景来引入这个话题吧. 在日常生活中,我们肯定收到过不少不少这样的短信,“双11约吗?,千款….”,“ ...
- stackExchange.redis 实现模糊匹配批量查询
如果使用redis的频次较高,那么业务中经常会出现需要根据关键字进行批量查询,所以总结一下StackExchange中使用批量查询的方法(如果数据量很大,那么在redis中模糊查询很耗时,请慎用!) ...
- spring cloud gateway(三、实现限流)
限流一般有两个实现方式,令牌桶和漏桶 金牌桶是初始化令牌(容器)的个数,通过拿走里边的令牌就能通过, 没有令牌不能报错,可以设置向容器中增加令牌的速度和最大个数 漏桶是向里边放入请求,当请求数量达到最 ...
随机推荐
- 使用PyCharm引入需要使用的包
在学习python的时候,被推荐了使用PyCharm这款IDE,但是经常在已经pip安装第三方包的时候import包的时候却发生了问题- -无法引入. 进行模块的加载,百度之后,了解到,在这款IDE中 ...
- svg的学习
svg的学习 1,初步了解 1,大致看了一下svg的简介,在图形的操作和展示上有很大的优势,例如不会失精:灵活的dom操作:很好的兼容性(IE需要下载插件).so,是一门值得深究的前端课程: 2,看了 ...
- Java源码赏析(三)初识 String 类
由于String类比较复杂,现在采用多篇幅来讲述 这一期主要从String使用的关键字,实现的接口,属性以及覆盖的方法入手.省略了大部分的字符串操作,比如split().trim().replace( ...
- tomcat在linux下安装
1.下载地址: https://tomcat.apache.org/download-90.cgi 2.上传linux 3.查看是否上传成功 4.解压: 5.进入后,查看README.md文件,可以查 ...
- Ubuntu修改时区和更新时间
先查看当前系统时间 root@ubuntu:/# date -R 结果时区是:-0500 我需要的是东八区,这儿显示不是,所以需要设置一个时区 1.运行tzselect root@ubuntu:/# ...
- Tomcat 第四篇:请求处理流程(上)
1. 引言 既然是在讲 Tomcat ,那么一个 HTTP 请求的请求流程是无论如何也绕不开的. 首先抛开所有,使用我们现有的知识面,猜测一下一个请求被 Tomcat 处理的过程: 1. 客户端(浏览 ...
- Generator函数在流程控制中的应用
扯蛋 做了两年的Nodejs全栈开发,不知道为什么跑来做游戏呢(大概是厦门nodejs不好找工作吧).用的是网易的pomelo的游戏框架.现接手了一个棋牌游戏:二十一点,不懂的规则的可以自行百度. 二 ...
- 单例模式,reorder详解,线程安全,双检查锁
单例模式,分为饿汉式单例 和 懒汉式单例. 先把本类对象所需内存在main函数执行前就new出来,这是饿汉式单例. 个人思考: 为什么饿汉式不独霸天下,还有什么必要去研究使用cpp11上支持的双检查锁 ...
- RHSA-2017:1931-中危: bash 安全和BUG修复更新(代码执行)
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- vue去掉地址栏#号
mode:'history' 将这代码放入router.js里面