04-实例_访问频率限制
6.1.2 实例:访问频率限制
因为无须考虑事务,使用Redis脚本实现访问频率限制非常简单。Lua代码如下:
local times = redis.call('incr', KEYS[1])
if times == 1 then
-- KEYS[1]键刚创建,所以为其设置生存时间
redis.call('expire', KEYS[1], ARGV[1])
end
if times > tonumber(ARGV[2]) then
return 0
end
return 1
这段代码实现的功能与我们之前所做的类似,不过简洁了很多,即使不了解Lua语言也能猜出大概的意思。如果有的地方看不懂也没关系,6.2节会专门介绍Lua的语法和调用Redis命令的方法。
那么,如何测试这个脚本呢?首先把这段代码存为ratelimiting.lua,然后在命名行中输入:
$ redis-cli --eval **/path/to/ratelimiting.lua** rate.limiting:127.0.0.1 , 10 3
其中 --eval 参数是告诉redis-cli读取并运行后面的Lua脚本,/path/to/ratelimiting.lua是ratelimiting.lua文件的位置,后面跟着的是传给Lua脚本的参数。其中“ , ”前的 rate. limiting:127.0.0.1 是要操作的键,可以在脚本中使用 KEYS[1] 获取,“ , ”后面的 10 和 3 是参数,在脚本中能够使用 ARGV[1] 和 ARGV[2] 获得。结合脚本的内容可知这行命令的作用就是将访问频率限制为每10秒最多3次,所以在终端中不断地运行此命令会发现当访问频率在10秒内小于或等于3次时返回1,否则返回0。
注意
上面的命令中“,”两边的空格不能省略,否则会出错。
对于 KEYS 和 ARGV 两个变量会在6.3节中详细介绍,在下一节中我们会专门介绍Lua的语法。