Lua

Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大,所以许多应用都选用它作为脚本语言,尤其是在游戏领域,暴雪公司的“魔兽世界”,“愤怒的小鸟”,Nginx将Lua语言作为扩展。Redis将Lua作为脚本语言可帮助开发者定制自己的Redis命令。

Redis 2.6 版本通过内嵌支持 Lua 环境。也就是说一般的运用,是不需要单独安装Lua的。

通过使用LUA脚本:

1、减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行;

2、原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入(Redis执行命令是单线程)。

3、复用性,客户端发送的脚本会永远存储在redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑。

不过为了我们方便学习Lua语言,我们还是单独安装一个Lua。

在Redis使用LUA脚本的好处包括:

1、减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行;

2、原子操作,Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件;

3、复用性,客户端发送的脚本会存储在Redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑

Lua入门

安装Lua

Lua在linux中的安装

到官网下载lua的tar.gz的源码包

1、wget http://www.lua.org/ftp/lua-5.3.6.tar.gz 2、tar -zxvf lua-5.3.6.tar.gz 进入解压的目录: 3、cd lua-5.3.6 4、make linux 5、make install(需要在root用户下) 如果报错,说找不到readline/readline.h, 可以root用户下通过yum命令安装 yum -y install libtermcap-devel ncurses-devel libevent-devel readline-devel 安装完以后再make linux / make install 最后,直接输入 lua命令即可进入lua的控制台: 复制代码

Lua基本语法

Lua 学习起来非常简单,当然再简单,它也是个独立的语言,自成体系,不可能完全在本课中全部讲述完毕,如果工作中有深研Lua的需要,可以参考《Lua程序设计》,作者罗伯拖·鲁萨利姆斯奇 (Roberto Ierusalimschy)。

现在我们需要:print("Hello World!")

可以在命令行中输入程序并立即查看效果。

或者编写一个Lua脚本

然后执行

注释

单行注释

两个减号是单行注释: -- 复制代码

多行注释

--[[ 注释内容 注释内容 --]] 复制代码

标示符

Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上 0 个或多个字母,下划线,数字(0 到 9)。

最好不要使用下划线加大写字母的标示符,因为Lua的语言内部的一些保留字也是这样的。

Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 LIJIN与lijin 是两个不同的标示符。以下列出了一些正确的标示符:

关键词

以下列出了 Lua 的保留关键词。保留关键字不能作为常量或变量或其他用户自定义标示符:

同时一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。

全局变量

在默认情况下,变量总是认为是全局的。

全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

如果你想删除一个全局变量,只需要将变量赋值为nil。这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。

Lua中的数据类型

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

我们可以使用 type 函数测试给定变量或者值的类型。

我们只选择几个要点做说明:

1、nil 类型表示一种没有任何有效值,它只有一个值 – nil,对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉,nil 作类型比较时应该加上双引号 "。

2、boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true。

3、Lua 默认只有一种 number类型 -- double(双精度)类型。

print(type(2)) print(type(2.2)) print(type(0.2)) print(type(2e+1)) print(type(0.2e-1)) 复制代码

都被看作是 number 类型

4、字符串由一对双引号或单引号来表示,也可以用[[ 与 ]] 表示,一般来说,单行文本用双引号或单引号,多行文本用[[ 与 ]] 。

5、在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字。

6、字符串连接使用的是 ..

7、使用 # 来计算字符串的长度,放在字符串前面

8、table可以做为数组,也可以作为为Hash,table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil

不同于其他语言的数组把 0 作为数组的初始索引,可以看到在Lua里表的默认初始索引一般以 1 开始。

把table做hash表用:

Lua 中的函数

在 Lua中,函数以function开头,以end结尾,funcName是函数名,中间部分是函数体:

function funcName () --[[ 函数内容 --]] end 复制代码

比如定义一个字符串连接函数:

function contact(str1,str2) return str1..str2 end print(contact("hello","Lijin")) 复制代码

Lua 变量

变量在使用前,需要在代码中进行声明,即创建该变量。

编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。

Lua 变量有:全局变量、局部变量。

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为 nil。

Lua中的控制语句

Lua中的控制语句和Java语言的差不多。

循环控制

Lua支持while 循环、for 循环、repeat...until循环和循环嵌套,同时,Lua提供了break 语句和goto 语句。

我们重点来看看while 循环、for 循环。

for 循环

Lua 编程语言中 for语句有两大类:数值for循环、泛型for循环。

数值for循环

Lua 编程语言中数值 for 循环语法格式:

for var=exp1,exp2,exp3 do <执行体> end 复制代码

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 "执行体"。exp3 是可选的,如果不指定,默认为1。

泛型for循环

泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。Lua 编程语言中泛型 for 循环语法格式:

--打印数组a的所有值

a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) end 复制代码

​i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

tbl3={age=18,name='lijin'} for i, v in pairs(tbl3) do print(i,v) end 复制代码

while循环

while(condition) do statements end a=10 while(a<20) do print("a= ",a) a=a+1 end 复制代码

if条件控制

Lua支持if 语句、if...else 语句和if 嵌套语句。

if 语句语法格式如下:

if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end if...else 语句语法格式如下: if(布尔表达式) then --[ 布尔表达式为 true 时执行该语句块 --] else --[ 布尔表达式为 false 时执行该语句块 --] end 复制代码

Lua 运算符

Lua提供了以下几种运算符类型:

算术运算符

+ 加法 - 减法 * 乘法 / 除法 % 取余 ^ 乘幂 - 负号 关系运算符 == 等于 ~= 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于 逻辑运算符 and 逻辑与操作符 or 逻辑或操作符 not 逻辑非操作符 复制代码

Lua其他特性

Lua支持模块与包,也就是封装库,支持元表(Metatable),支持协程(coroutine),支持文件IO操作,支持错误处理,支持代码调试,支持Lua垃圾回收,支持面向对象和数据库访问,更多详情请参考对应书籍。

Java对Lua的支持

目前Java生态中,对Lua的支持是LuaJ,是一个 Java 的 Lua 解释器,基于 Lua 5.2.x 版本。

Maven

<dependency> <groupId>org.luaj</groupId> <artifactId>luaj-jse</artifactId> <version>3.0.1</version> </dependency> 复制代码

参考代码

参见luaj模块,请注意,本代码仅供参考,在工作中需要使用Lua语言或者Java中执行Lua脚本的,请自行仔细学习Lua语言本身和luaj-jse使用,不提供任何技术支持。一般这种形式用得非常少。

Redis中的Lua

eval 命令

命令格式

EVAL script numkeys key [key ...] arg [arg ...] 复制代码

命令说明

1、script 参数:

是一段 Lua 脚本程序,它会被运行在Redis 服务器上下文中,这段脚本不必(也不应该)定义为一个 Lua 函数。

2、numkeys 参数:

用于指定键名参数的个数。

3、key [key...] 参数: 从EVAL 的第三个参数开始算起,使用了 numkeys 个键(key),表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用1为基址的形式访问(KEYS[1],KEYS[2]···)。

4、arg [arg...]参数:

可以在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似(ARGV[1],ARGV[2]···)。

示例

eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 复制代码

在这个范例中key [key ...] 参数的作用不明显,其实它最大的作用是方便我们在Lua 脚本中调用 Redis 命令

Lua 脚本中调用 Redis 命令

这里我们主要记住 call() 命令即可:

eval "return redis.call('mset',KEYS[1],ARGV[1],KEYS[2],ARGV[2])" 2 key1 key2 first second 复制代码

evalsha 命令

但是eval命令要求你在每次执行脚本的时候都发送一次脚本,所以Redis 有一个内部的缓存机制,因此它不会每次都重新编译脚本,不过在很多场合,付出无谓的带宽来传送脚本主体并不是最佳选择。

为了减少带宽的消耗, Redis 提供了evalsha 命令,它的作用和 EVAL一样,都用于对脚本求值,但它接受的第一个参数不是脚本,而是脚本的 SHA1 摘要。

这里就需要借助script命令。

script flush :清除所有脚本缓存。

script exists :根据给定的脚本校验,检查指定的脚本是否存在于脚本缓存。

script load :将一个脚本装入脚本缓存,返回SHA1摘要,但并不立即运行它。

script kill :杀死当前正在运行的脚本。

这里的 SCRIPT LOAD 命令就可以用来生成脚本的 SHA1 摘要

script load "return redis.call('set',KEYS[1],ARGV[1])" 复制代码

​然后就可以执行这个脚本

evalsha "c686f316aaf1eb01d5a4de1b0b63cd233010e63d" 1 key1 testscript 复制代码

redis-cli 执行脚本

可以使用 redis-cli 命令直接执行脚本,这里我们直接新建一个 lua 脚本文件,用来获取刚刚存入 Redis 的 key1的值,vim redis.lua,然后编写 Lua 命令:

local value = redis.call('get','key1') return value 复制代码

​然后执行

./redis-cli -p 6379 --eval ../scripts/test.lua 复制代码

也可以

./redis-cli -p 6379 script load "$(cat ../scripts/test.lua)" 复制代码

持续创作,加速成长!

Redis-Lua语言:简单小巧但功能强大相关推荐

  1. 小体积台式计算机,小体积办公精锐,它成商用台式电脑安心之选?小巧却功能强大...

    导语小体积办公精锐,它成商用台式电脑安心之选?小巧却功能强大 体积硕大.造型呆板,在这个颜值至上的时代,办公PC这个市场的颜值水准却好像不太能跟得上人们大踏步前进的节奏.好在这种情况现已有所缓和,商用 ...

  2. python简单编程语言_功能强大而又简单易学的编程语言Python

    Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言(维基百科).自从上次写那个批量Blast小程序的时候接触了Python,发现这个玩意儿真是好用,后来还用它弄了个动态 ...

  3. java工作日报管理系统_GitHub - LovebuildJ/book-manager: JavaWeb图书管理系统,简单易用功能强大,可拓展性高,集成主流框架...

    book-manager 介绍 图书管理系统 请勿忽略更新日志, 会有详细的版本更新说明! 软件截图 在线API接口文档 登录 首页轮播 图书列表 图书上架 图书编辑 图书删除 图书借阅 图书检索 图 ...

  4. c语言 实现sizeof功能,C语言简单实现sizeof功能代码

    sizeof不是函数,而是运算符,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义. 下面给出一个sizeof的一个宏定义实现版本 #defin ...

  5. 体积小巧、功能强大的代理工具 -- 3proxy

    3proxy是一个由俄罗斯人开发的多平台代理软件,支持http/https/ftp/socks4/socks5/socks4a/socks5a等多种代理方式.(又是俄罗斯人) 同时它还支持将HTTP代 ...

  6. lua语言xml的解析

    1. 编写目的 介绍一种方法,解析lua语言中xml类型的变量. 2. 具体过程 变量是一个xml字符串如下: <?xml version="1.0" encoding=&q ...

  7. 高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库

    文章目录 导读 概述 实现步骤 注解方式配置 Redis lua脚本和异步持久化功能的开发 Service层添加Redis抢红包的逻辑 Controller层新增路由方法 构造模拟数据,测试 代码 总 ...

  8. Lua脚本语言学习总结 入门、复习Lua语言看这一篇就够了

    文章目录 Lua 概念 特性 应用场景 Lua的安装 Lua的语法 第一个Lua程序 Lua的注释 标识符 关键字 运算符 全局变量&局部变量 Lua数据类型 nil boolean numb ...

  9. 深入分析 Redis Lua 脚本运行原理

    Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题.Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执 ...

最新文章

  1. db2 最近三个月_2020.8.11 腰椎微创三个月后
  2. strcpy,strncpy,memcpy,memmove
  3. 重视细节,方能得到认可
  4. hdu2037今年暑假不AC
  5. cups 设置打印机纸张_惠普打印机打印模糊怎么办 惠普打印机打印模糊解决【方法】...
  6. 你是这样理解shell编程的嘛?
  7. 2022中山大学计算机技术专硕考研初试、复试经验帖
  8. CodeForces - 1427C
  9. 流媒体服务器ZLMediaKit
  10. 利用“串口调试助手”等软件调试 PROTEUS 环境中 51单片机 的串行通信
  11. tieredImageNet 数据集介绍
  12. vue ssr搭建服务端渲染项目
  13. ipados 蓝牙 android,iPadOS13.4对于无线或蓝牙鼠标的兼容性… - Apple 社区
  14. 无约束优化:线搜索最速下降
  15. 虚拟内存(为什么要有虚拟内存)
  16. 香港计算机授课型研究生,香港城市大学授课型硕士
  17. 文章管理系统的系统分析与设
  18. 网络安全实验6 认识XSS 盗取cookie
  19. 58到家,或将到不了家
  20. Simpsons’ Hidden Talents(辛普森一家的隐藏天赋 )(kmp经典模板题) HDU - 2594

热门文章

  1. 常用函数-生成各种类型随机数
  2. 西门子rwd68温控器说明书_西门子RWD68说明书.pdf
  3. react 动态修改路由_升级到 React Router 4 并实现动态加载和模块热替换
  4. 模块 14 - 15:网络应用通信考试
  5. 如何学好计算机应用基础这门课,如何学好《计算机应用基础》课.docx
  6. 商业模式新生代之开放商业模式
  7. PowerDVD14极致蓝光版注册激活补丁
  8. 股票F10关键字过滤工具
  9. PMM2:迟到的礼物-2.8.0版本发布
  10. 《网页制作与网站建设从入门到精通》答案