使用redis调用lua脚本的方式对接口进行限流
java端实现:
//初始化一个redis可执行的lua
DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<List>();
defaultRedisScript.setResultType(List.class);
defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis_limit.lua"))); List<String> key = new ArrayList<>();//这里虽然使用List集合,但是暂时只存储一个值(Key+时间戳)
List<String> args = Lists.newArrayList("参数值可以是多个");
//这里的StringRedisTemplate需要自己初始化并配置
List<String> ret = new StringRedisTemplate().execute(defaultRedisScript, key, args);//返回也是一个List,就是在lua中的返回值,默认取出第一个即可
lua脚本执行代码:
local key= KEYS[] --获取需要限流接口的key(每秒都会生成一个新的,当然key的过期时间也是1秒)
local limitRqNum= tonumber(ARGV[]) --每秒上限访问个数(获取java调用脚本阶段传入的参数)
local currRqNum= tonumber(redis.call('get',key) or "") --获取当前redis中当前秒内已经存储的请求总数
if currRqNum+ > limitRqNum then --超出流量限制大小的话
return
else --如果没有超出限制请求大小则将redis中记录的请求总数+1,并设置该key
redis.call('INCRBY',key,"") --将请求计数+1
--设置过期时间2秒,这个设置主要是让这个key既能自动失效删除,又能保证在至少1秒内不过期仍旧可以看到当前秒内总请求记录数
redis.call('EXPIRE',key,"")
return
end
使用redis调用lua脚本的方式对接口进行限流的更多相关文章
- 快速入门Redis调用Lua脚本及使用场景介绍
Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本
一.引言 学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续.上一篇文章简要的介绍了如何在Linux环境下安装Lua,并介绍了在Linux环境下如何编写L ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
- redis使用Lua脚本
最近在看<Redis入门指南>第二版,感觉收获挺大,推荐大家有时间看一看.其中有一章讲Lua脚本,感觉挺实用,把总结整理一下. Redis在2.6中推出了脚本功能,允许开发者使用Lua语言 ...
- Redis结合Lua脚本实现高并发原子性操作
从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis … 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚 ...
- .Net Core使用分布式缓存Redis:Lua脚本
一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...
- 要想用活Redis,Lua脚本是绕不过去的坎
前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这 ...
- 用C#调用Lua脚本
用C#调用Lua脚本 一.引言 学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续.上一篇文章简要的介绍了如何在Linux环境下安装Lua,并介绍了在Linux环境下如何 ...
- redis中lua脚本的简单使用
一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然 ...
随机推荐
- golang-os文件操作
golang-os文件操作 package main import ( "fmt" "os" ) //func main() { // f,err :=os.C ...
- Java 获取客户端真实IP地址
本文基于方法 HttpServletRequest.getHeader 和 HttpServletRequest.getRemoteAddr 介绍如何在服务器端获取客户端真实IP地址. 业务背景 服务 ...
- jquery选择器(1)
jQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") ...
- android -------- GifView 显示gif图片
最近的项目需要在界面显示Gif动图,查找网络资料,总结了一下,分享一下, 一个GifView的gif图加载库以有效地显示GIF, 您可以启动,暂停和停止gifView 在app 的 build.gra ...
- Linux永久挂载新的硬盘
1. 查看设备挂载的情况 fdisk -l 2. 查看数据盘是否格式化 lsblk -f 3. 如果没有,格式化硬盘 sudo mkfs.xfs /dev/vdb 4. 创建挂载点,例如 mkdir ...
- SSIM (Structural SIMilarity) 结构相似性
公式基于样本x和 y 之间的三个比较衡量:亮度 (luminance).对比度 (contrast) 和结构 (structure). 每次计算的时候都从图片上取一个 N*N的窗口,然后不断滑动窗口进 ...
- redis-cli 使用密码登录
#./redis-cli 输入auth +空格+ 刚才设置的密码 成功
- openresty开发系列24--openresty中lua的引入及使用
openresty开发系列24--openresty中lua的引入及使用 openresty 引入 lua 一)openresty中nginx引入lua方式 1)xxx_by_lua ---> ...
- C++数据存储方式
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量.函数参数等. 2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去 ...
- 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)
数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...