Redis执行Lua脚本的好处与示例代码

 更新时间:2018年10月15日 09:50:47   作者:yanghuahui  
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。下面这篇文章主要给大家介绍了关于Redis执行Lua脚本的好处与示例代码,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务端原子的执行多个Redis命令。

其中,使用EVAL命令可以直接对输入的脚本进行求值:

redis>EVAL "return 'hello world'" 0
"hello world"

使用脚本的好处如下:

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

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

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

Redis执行Lua脚本

实现一个访问频率控制,某个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。

测试运行如下:

[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

补充:

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

摘自《Redis入门指南》

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Redis Lua脚本实现ip限流示例

    Redis Lua脚本实现ip限流示例

    这篇文章主要介绍了Redis Lua脚本实现ip限流示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Redis数据结构之链表详解

    Redis数据结构之链表详解

    大家好,本篇文章主要讲的是Redis数据结构之链表详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Redis如何正确关闭和开启持久化

    Redis如何正确关闭和开启持久化

    本文主要介绍了Redis如何正确关闭和开启持久化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • redission分布式锁防止重复初始化问题

    redission分布式锁防止重复初始化问题

    这篇文章主要介绍了redission分布式锁防止重复初始化问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Redis数据过期策略的实现详解

    Redis数据过期策略的实现详解

    最近项目当中遇到一个需求场景,需要清空一些存放在Redis的数据,本文对Redis的过期机制简单的讲解一下,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Redis Sentinel的基本搭建

    Redis Sentinel的基本搭建

    这篇文章主要介绍了Redis Sentinel的使用,帮助大家更好的理解和学习使用Redis数据库,感兴趣的朋友可以了解下
    2021-03-03
  • redis哨兵模式说明与搭建详解

    redis哨兵模式说明与搭建详解

    这篇文章主要介绍了redis哨兵模式说明与搭建详解,需要的朋友可以参考下
    2023-01-01
  • Redis读写分离搭建的完整步骤

    Redis读写分离搭建的完整步骤

    为满足读多写少的业务场景.最大化节约用户成本.云数据库Redis版推出了读写分离规格,为用户提供透明、高可用、高性能、高灵活的读写分离服务,这篇文章主要给大家介绍了关于Redis读写分离搭建的相关资料,需要的朋友可以参考下
    2021-09-09
  • Redis凭啥可以这么快

    Redis凭啥可以这么快

    本文详细的介绍了为啥使用Redis的时候,可以做到非常快的读取速度,对于大家学习Redis非常有帮助,希望大家喜欢
    2021-02-02
  • redis使用Lua脚本解决多线程下的超卖问题及原因解析

    redis使用Lua脚本解决多线程下的超卖问题及原因解析

    这篇文章主要介绍了redis使用Lua脚本解决多线程下的超卖问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05

最新评论