Redis执行Lua脚本详细实例

6 篇文章 0 订阅
2 篇文章 0 订阅

 

1、redis使用lua的好处

​Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行,使用lua脚本有以下一些好处:

1).减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。

2).原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。

3).复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。

 

2、redis执行lua例子

例子:

通过Lua脚本高效实现一个访问频率控制,某个ip在短时间内频繁访问页面,需要记录并检测出来。

在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.luarate.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@iZ94e7qu9l2Z ~]# redis-cli--eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3

(integer) 1

[root@iZ94e7qu9l2Z ~]# redis-cli--eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3

(integer) 1

[root@iZ94e7qu9l2Z ~]# redis-cli--eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3

(integer) 1

[root@iZ94e7qu9l2Z ~]# redis-cli--eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3

(integer) 0

[root@iZ94e7qu9l2Z ~]# redis-cli--eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3

(integer) 0

 

3、lua在游戏上的广泛应用

现在Lua脚本用在很多游戏上,主要是Lua脚本做到可以嵌入到其他程序中运行,游戏升级的时候,可以直接升级脚本,而不用重新安装游戏。比如游戏的很多关卡,只需要增加lua脚本,在游戏中嵌入Lua解释器,游戏团队线上更新Lua脚本,然后游戏自动下载最新的游戏关卡。例如之前很多的游戏《愤怒的小鸟》就是用Lua语言实现的关卡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java高知社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值