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 thenredis.call('expire',KEYS[1], ARGV[1])
endif times > tonumber(ARGV[2]) thenreturn 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语言实现的关卡。

转载于:https://www.cnblogs.com/tinywan/p/5979500.html

Redis脚本插件之————执行Lua脚本示例相关推荐

  1. android lua sd卡,记Android层执行Lua脚本的一次实践

    0. 前言 最近一直在写Lua脚本,有时候出了问题,不知道是Lua层的问题,还是上游的问题,不知道从何下手.于是我学习了一点C/C++和JNI,把整个解析Lua脚本包.执行Lua脚本的流程全部都读了一 ...

  2. PHP中使用redis执行lua脚本示例

    一.引言 redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功 ...

  3. Redis:EVAL执行Lua脚本

    EVAL 脚本 numkeys 键[键...] arg [arg ...] 自Redis2.6.0版本起可用. 时间复杂度:取决于执行的脚本. EVAL介绍 EVAL和EVALSHA用于从Redis2 ...

  4. PHP中使用redis 执行lua脚本

    在php中,可以通过redis执行lua脚本 1.脚本 <?php $redis = new Redis(); #实例化redis类 $redis->connect('127.0.0.1' ...

  5. redis执行lua脚本

    从redis 2.6.0版本开始,redis内置了Lua解释器,并提供了eval命令来解析Lua脚本求值. 1. 语法格式 语法: eval script numkeys keys args 参数: ...

  6. Redis学习笔记 - Lua脚本(2) - Lua脚本的实现

    参考:<<Redis设计与实现>> 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异 Redis中Lua脚本相关命令介绍以及简单使用,参考博客:https://b ...

  7. redis原子性读写操作之LUA脚本和watch机制

    为什么80%的码农都做不了架构师?>>>    最近在开发电商平台的子系统--储值卡系统,系统核心业务涉及到金额消费以及库存控制,由于redis事务并不能保证操作的原子性,因此为了解 ...

  8. redis-cli redisTemplate执行Lua脚本,解决redisTemplate.opsForSet().members获取数据问题

    解决问题-问题描述 在使用redisTemplate.opsForSet().members(key)获取key String; value Set<Entity>数据时候出现如下问题. ...

  9. redisTemplate执行lua脚本

    项目场景: 提示:redisTemplate执行lua脚本 例如:项目场景: 问题描述 提示:执行lua脚本 例如: 原因分析: 提示:这里填写问题的分析: 例如: afadf 解决方案: 提示:这里 ...

最新文章

  1. Leetcode PHP题解--D54 937. Reorder Log Files
  2. SpringMvc 事务的注解配置、实现、挂起
  3. [BZOJ1925]地精部落
  4. boost::hana::detail::fast_and用法的测试程序
  5. struts2配置详解(struts.xml配置详解)
  6. vue移动端通过px动态计算图片宽高_vue图片宽高自适应_移动web图片高度自适应的解决方案...
  7. vue跨域问题:proxy代理跨域
  8. FZU_1683 矩阵快速幂 求和
  9. HDU2553_N皇后_位运算DFS
  10. jsoup抓取html中的js,使用Jsoup,抓取整个网站(包括图片、js、css)
  11. Python3 列表内置函数
  12. python 颜色调整(饼状图)
  13. Mac install ninja_玩游戏出现机器码或被封,用修改网卡mac物理地址的方法试一试...
  14. 服务器装2t硬盘分区,2T移动硬盘分区办法
  15. 世链投研|链游操作指南之MIR4
  16. airpods版本号_怎么看airpods版本号 苹果airpods查看固件版本教程
  17. Windows软件之——RocketDock之无法拖放图标到dock栏
  18. 此windows不是正版
  19. 最好用的 Base64 在线工具
  20. 【无标题】py控制泰克示波器,

热门文章

  1. Python入门--列表元素的增加操作,append(),extend(),insert(),切片
  2. java dom获取命名空间属性_Java DOM XML解析::获取元素属性值
  3. UnityShader7:内置包含文件UnityCG.cginc与GG/HLSL语义
  4. UnityShader1:渲染流水线
  5. 2017百度之星初赛:A-1006. 度度熊的01世界(DFS)
  6. bzoj 2803: [Poi2012]Prefixuffix(双Hash)
  7. window下hadoop、hbase的安装和eclipse开发环境配置
  8. caffe:制作自己的数据集train.txt和val.txt,生成lmdb文件
  9. zynq文档阅读之EMIO和MIO的细微差别
  10. matlab设计一个简单图像直方图均衡的GUI程序