实现一个访问频率控制,某个ip在短时间内频繁访问页面,需要记录并检测出来,就可以通过Lua脚本高效的实现在redis客户端机器上
1.即使用Lua控制IP访问频率:(本实例 针对固定窗口的访问频率,而动态的非滑动窗口)
1.新建一个文件1.lua,内容如下:
local times = redis.call('incr',KEYS[1])
if times == 1 then
redis.call('expire',KEYS[1], ARGV[1])
end
if times > tonumber(ARGV[2]) then
return 0
end
return 1
2.在redis客户端机器上,测试这个脚本
redis-cli --eval 1.lua rate.limitingl:127.0.0.1 , 10 3
–eval参数是告诉redis-cli读取并运行后面的Lua脚本,1.lua是脚本的位置,后面跟着是传给Lua脚本的参数。
其中",“前的rate.limiting:127.0.0.1是要操作的键,可以在脚本中用KEYS[1]获取,”,“后面的10和3是参数,在脚本中能够使用ARGV[1]和ARGV[2]获得。
注:”,"两边的空格不能省略,否则会出错
测试运行如下:
[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
这行命令的作用是将访问频率限制为每10秒最多3次,所以在终端中不断的运行此命令会发现当访问频率在10秒内小于或等于3次时返回1,否则返回0
2.redis执行Lua脚本:
执行命令: redis-cli -a 密码 --eval Lua脚本路径 key [key …] , arg [arg …]
如:redis-cli -a 123456 --eval ./1.lua userName , zhangsan lisi
注:1. key [key …] 和 arg [arg …] 之间的“ , ”,英文逗号前后必须有空格,否则死活都报错
2.通常情况下我们都是把lua script放到一个lua文件中,然后执行这个lua脚本 实战操作