Redis脚本插件之————执行Lua脚本示例

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。
+关注继续查看

Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到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
  1. --eval参数是告诉redis-cli读取并运行后面的Lua脚本,
  2. ratelimiting.lua是脚本的位置,后面跟着是传给Lua脚本的参数。
  3. 其中","前的rate.limiting:127.0.0.1是要操作的键,可以再脚本中用KEYS[1]获取,
  4. ","后面的10和3是参数,在脚本中能够使用ARGV[1]和ARGV[2]获得。
  5. 注:","两边的空格不能省略,否则会出错

结合脚本的内容可知这行命令的作用是将访问频率限制为每10秒最多3次,所以在终端中不断的运行此命令会发现当访问频率在10秒内小于或等于3次时返回1,否则返回0。

测试运行如下:

root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval ratelimiting.lua rate.limitingl:127.0.0.1 , 10 3
Can't open file 'ratelimiting.lua': No such file or directory
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 1
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 0
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 0
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3
(integer) 0
root@iZ23a7607jaZ:/home/tinywan/lua# redis-cli --eval redis-test01.lua rate.limitingl:127.0.0.1 , 10 3

补充:

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

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
22天前
|
消息中间件 存储 NoSQL
【实战】使用Lua脚本怎么清理redis中的数据【实战】使用Lua脚本怎么清理redis中的数据
首先我们通过hiredis 向redis 中写入了数据,这里我们主要以测试为目的,所以,Key 值设定为毫秒级时间戳。
15 0
|
22天前
|
NoSQL Redis
RedisTemplate执行lua脚本在Redis集群模式下报错EvalSha is not supported in cluster environment.
RedisTemplate执行lua脚本在Redis集群模式下报错EvalSha is not supported in cluster environment.
|
23天前
|
存储 缓存 NoSQL
redis集群+JedisCluster+lua脚本实现分布式锁
redis集群+JedisCluster+lua脚本实现分布式锁
|
23天前
|
NoSQL Redis
redisTemplate+redis+lua解决redis分布式锁集群报错问题
redisTemplate+redis+lua解决redis分布式锁集群报错问题
|
25天前
|
存储 NoSQL 关系型数据库
redis协议与异步方式(redis网络层、pipeline、事务、lua脚本、ACID特性、发布订阅、hiredis实现同步连接与异步连接)
redis协议与异步方式(redis网络层、pipeline、事务、lua脚本、ACID特性、发布订阅、hiredis实现同步连接与异步连接)
33 0
|
12月前
|
监控 NoSQL Java
阿里二面:redis分布式锁过期了但业务还没有执行完,怎么办
阿里二面:redis分布式锁过期了但业务还没有执行完,怎么办
435 0
阿里二面:redis分布式锁过期了但业务还没有执行完,怎么办
|
NoSQL Redis
Redis执行save命令时报错ERR
Redis执行save命令时报错ERR
209 0
Redis执行save命令时报错ERR
|
NoSQL 前端开发 测试技术
|
NoSQL Shell Redis
shell脚本一键部署——Redis(直接复制执行)亲测100% 有效
首先所需软件包拖进目录,然后编辑一个脚本,复制一下脚本,source执行一下即可
shell脚本一键部署——Redis(直接复制执行)亲测100% 有效
|
移动开发 缓存 NoSQL
你知道 Redis 服务器接收到一条命令是如何执行的吗?
Hello 大家好,我是阿粉,Redis 作为工作中不可缺少的缓存组件,相信很多小伙伴都会使用到,我们日常使用的时候都是通过代码或者客户端去链接 Redis 服务器来操作数据的。那么一条简单的set name ziyou 命令是如何执行的,中间都经历了哪些过程想必很少会有人去了解。今天阿粉就带大家看一下一条简单的set name ziyou 命令是如何执行的。
你知道 Redis 服务器接收到一条命令是如何执行的吗?
热门文章
最新文章
推荐文章
更多