Redis执行Lua脚本示例

Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:

  • 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
  • 2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
  • 3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。

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

在redis客户端机器上,新建一个文件ratelimiting.lua,内容如下

复制代码

1local times = redis.call('incr',KEYS[1]) 2 3if times == 1 then 4 redis.call('expire',KEYS[1], ARGV[1]) 5end 6 7if times > tonumber(ARGV[2]) then 8 return 0 9end 10return 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。

测试运行如下:

复制代码

1[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3 2(integer) 1 3[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3 4(integer) 1 5[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3 6(integer) 1 7[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3 8(integer) 0 9[root@rhel6 redis-learning]# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3 10(integer) 0

复制代码

补充:

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

摘自《Redis入门指南》

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java操作lua脚本

java操作lua脚本实例1.前言在上一篇文章Redis中使用Lua脚本来实现并发下的原子操作中我对Lua语言的一些简单的语法及其在Redis中的操作进行了介绍,但是在Java开发中我们还需要进一步的学习才能使这种技术落地。今天就结合SpringDataRedis这个我们经常使用的Redis开发组件来实际尝试一下Lua脚本。

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Redis+Lua——他叫了外援

    Redis从2.6版本开始引入对Lua脚本的支持,通过在Redis服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务端原子的执行多个Redis命令。Lua    Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。为