1. 简介
1.1 概念
- Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放。
- 其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。因为广泛的应用于:游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件等。
- 比如:Lua脚本用在很多游戏上,主要是Lua脚本可以嵌入到其他程序中运行,游戏升级的时候,可以直接升级脚本,而不用重新安装游戏。
1.2 优势
- 减少网络开销:在Redis操作需求需要向Redis发送5次请求,而使用脚本功能完成同样的操作只需要发送一个请求即可,减少了网络往返时延。
- 原子操作: Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说就是在编写脚本的过程中无需担心会出现竞态条件,也就无需使用事务。事务可以完成的所有功能都可以用脚本来实现。
- 复用:客户端发送的脚本会永久存储在Redis中,这就意味着其他客户端(可以是其他语言开发的项目)可以复用这一脚本而不需要使用代码完成同样的逻辑。
1.3 劣势
- Nil字符问题
- 没有好的垃圾回收机制
2. Lua基础
2.1 Lua基础类型
数据类型 | 描述 |
---|---|
nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false) |
Boolean | 包含两个值:false和true |
number | 表示双精度类型的实浮点数 |
string | 字符串由一对双引号或单引号来表示 |
function | 由 C 或 Lua 编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个"关联数组"(associative arrays) |
2.2 Lua相关命令
-
执行lua脚本:EVAL script numkeys key [key …] arg [arg …]
-
执行lua脚本:EVALSHA sha1 numkeys key [key …] arg [arg …]
-
查看指定的脚本是否已经被保存在缓存当中:SCRIPT EXISTS sha1 [sha1 …]
-
从脚本缓存中移除所有脚本:SCRIPT FLUSH
-
杀死当前正在运行的 Lua 脚本:SCRIPT KILL
-
将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本:SCRIPT LOAD script
Lua的变量分为全局变量和局部变量。全局变量无需声明就可以直接使用,默认值是nil。
3. Lua脚本应用场景
3.1 laravel+Redis-lua脚本-限流漏桶算法
说明:漏桶算法的实现思路比较简单,水(请求)先流入到桶中,然后桶以一定的速度出水(接口有响应速率),当水流过大时(访问频率超过设置的阈值),系统服务就会拒绝请求。强行限制系统单位时间内访问的请求量。
漏桶算法有两个关键变量:桶的大小和出水速率,他们共同决定了单位时间内系统能接收的最大请求量。因为漏桶算法中桶的大小和出水速率是固定的参数。