Redis执行Lua脚本示例

Redis在2.6推出了脚本功能,容许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处以下: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])
end

if times > tonumber(ARGV[2]) then
    return 0
end
return 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。lua

测试运行以下:spa

[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

 

补充:code

如今Lua脚本用在不少游戏上,主要是Lua脚本作到能够嵌入到其余程序中运行,游戏升级的时候,能够直接升级脚本,而不用从新安装游戏。好比游戏的不少关卡,只须要增长lua脚本,在游戏中嵌入Lua解释器,游戏团队线上更新Lua脚本,而后游戏自动下载最新的游戏关卡。例如以前不少的游戏《愤怒的小鸟》就是用Lua语言实现的关卡。blog

摘自《Redis入门指南》游戏

相关文章
相关标签/搜索