使用lua脚本编写访问次数限制
来源:互联网 发布:js uint8array 合并 编辑:程序博客网 时间:2024/05/17 22:39
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:
- 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
- 2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
- 3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。
实现一个访问频率控制,某个ip在短时间内频繁访问页面,需要记录并检测出来,就可以通过Lua脚本高效的实现
在redis客户端机器上,新建一个文件ratelimiting.lua,内容如下
local times = redis.call('incr',KEYS[1])if times == 1 then redis.call('expire',KEYS[1], ARGV[1])endif times > tonumber(ARGV[2]) then return 0endreturn 1
在redis客户端机器上,如何测试这个脚本呢?如下:
redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3
–eval参数是告诉redis-cli读取并运行后面的Lua脚本,ratelimiting.lua是脚本的位置,后面跟着是传给Lua脚本的参数。其中”,”前的rate.limiting:127.0.0.1是要操作的键,可以再脚本中用KEYS[1]获取,”,”后面的10和3是参数,在脚本中能够使用ARGV[1]和ARGV[2]获得。注:”,”两边的空格不能省略,否则会出错
结合脚本的内容可知这行命令的作用是将访问频率限制为每10秒最多3次,所以在终端中不断的运行此命令会发现当访问频率在10秒内小于或等于3次时返回1,否则返回0。
测试运行如下:
[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3(integer) 1[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3(integer) 1[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3(integer) 1[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3(integer) 0[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3(integer) 0
补充:
现在Lua脚本用在很多游戏上,主要是Lua脚本做到可以嵌入到其他程序中运行,游戏升级的时候,可以直接升级脚本,而不用重新安装游戏。比如游戏的很多关卡,只需要增加lua脚本,在游戏中嵌入Lua解释器,游戏团队线上更新Lua脚本,然后游戏自动下载最新的游戏关卡。例如之前很多的游戏《愤怒的小鸟》就是用Lua语言实现的关卡。
摘自《Redis入门指南》
阅读全文
0 0
- 使用lua脚本编写访问次数限制
- nginx+lua 限制接口访问次数
- 接口访问次数限制
- 使用 Lua 编写可嵌入式脚本
- 使用 Lua 编写可嵌入式脚本收藏
- 使用 Lua 编写可嵌入式脚本
- 使用 Lua 编写可嵌入式脚本
- 使用 Lua 编写可嵌入式脚本
- 使用 Lua 编写可嵌入式脚本
- 使用lua脚本编写wireshark协议插件
- 使用lua脚本编写wireshark协议插件
- 使用 Lua 编写可嵌入式脚本
- Lua开发环境搭建(二)--使用Editplus编写Lua脚本
- 使用redis进行用户接口访问时间次数限制
- 使用lua脚本为wireshake编写自定义协议解析器
- 注册表限制软件使用次数
- 在一定的时间内限制访问次数
- 服务器访问次数限制实现的思路
- 【shro】--- 授权
- 图论题库(转载自Enstein_Jun)
- JavaScript学习——DOM对象
- 在QTableWidgetItem 中嵌套多行及行高自适应
- java 命令行参数、随机数Math.random的用法及使用误区、Array.sort()的用法、Arrays类中的方法
- 使用lua脚本编写访问次数限制
- 网络管理(九)
- java基础之网络编程
- Gson将JsonObject转JavaBean整条崩溃状况解决
- #NOIP模拟赛#Cool子集(Dp + 状压)
- 简单命令行创建ReactApp
- python 迭代器,生成器
- 这篇经验说不定会帮你夺冠医疗AI大赛哦
- 软件测试黑马工程师---接口测试