
本文目标
- 学习lua基本语法
- 能够采用redis+lua
lua 基本语法
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
设计目的
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 特性
- 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
基本语法
-- 行注释 |
Redis + Lua
在 Redis 中,执行 Lua 语言是原子性的,有助于 Redis 对并发数据一致性的支持。
为什么要用lua
- 减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
- 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他进程或者进程的命令插入。(最重要)
- 复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。
两种方法运行脚本
- 直接输入一些 Lua 语言的程序代码;简单的脚本可以直接采用这种
- 将 Lua 语言编写成文件。有一定逻辑的采用这种
基本命令
eval lua-script key-num [key1 key2 key3 ...] [value1 value2 value3 ...] |
其中:
- eval 代表执行 Lua 语言的命令。
- Lua-script 代表 Lua 语言脚本。
- key-num 整数代表参数中有多少个 key,需要注意的是 Redis 中 key 是从 1 开始的,如果没有 key 的参数,那么写 0。
- [key1 key2 key3…] 是 key 作为参数传递给 Lua 语言,也可以不填它是 key 的参数,但是需要和 key-num 的个数对应起来。
- [value1 value2 value3…] 这些参数传递给 Lua 语言,它们是可填可不填的。
实例一 嵌入脚本
基本用法:set、get
# set |
字段说明
- KEYS[1]: 需要大写,对应的是1之后的lua-key, 【占位符】
- 1: 代表之后key的个数,多余的舍弃
- ARGV[1]: 需要大写,对应的是value的第一个
注意事项
- KEYS、ARGV:需要大写
- 内部需要用单引号
node代码
// 嵌入脚本 |
const evalScript = `return redis.call('SET', KEYS[1], ARGV[2])`; |
实例二 脚本文件 – 频次限制
// 脚本文件 |
--[[ |
➜ 6Lua git:(main) ✗ ts-node index.ts |
实例三 脚本文件 – 自增ID
|
参考链接
Redis乐观锁解决高并发抢红包的问题
Lua 教程
LUA简明教程
Redis中使用Lua语言
【redis进阶(1)】redis的Lua脚本控制(原子性)