当前位置:嗨网首页>书籍在线阅读

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] 获取,“ , ”后面的 103 是参数,在脚本中能够使用 ARGV[1]ARGV[2] 获得。结合脚本的内容可知这行命令的作用就是将访问频率限制为每10秒最多3次,所以在终端中不断地运行此命令会发现当访问频率在10秒内小于或等于3次时返回1,否则返回0。

注意

上面的命令中“,”两边的空格不能省略,否则会出错。

对于 KEYSARGV 两个变量会在6.3节中详细介绍,在下一节中我们会专门介绍Lua的语法。