1. 前言
Redis 是高性能的 KV 内存数据库,除了做缓存中间件的基本作用外还有很多用途。Redis 提供了丰富的命令来供我们使用以实现一些计算。Redis 的单个命令都是原子性的,有时候我们希望能够组合多个 Redis 命令,并让这个组合也能够原子性的执行,甚至可以重复使用。Redis 开发者意识到这种场景还是很普遍的,就在 2.6 版本中引入了一个特性来解决这个问题,这就是 Redis 执行 Lua 脚本。
2. Lua
Lua 也算一门古老的语言了,玩魔兽世界的玩家应该对它不陌生,WOW 的插件就是用 Lua 脚本编写的。在高并发的网络游戏中 Lua 大放异彩被广泛使用。
Lua 广泛作为其它语言的嵌入脚本,尤其是 C/C++,语法简单,小巧,源码一共才 200 多 K,这可能也是 Redis 官方选择它的原因。
另一款明星软件 Nginx 也支持 Lua,利用 Lua 也可以实现很多有用的功能。
3. Lua 并不难
Redis 官方指南也指出不要在 Lua 脚本中编写过于复杂的逻辑。
为了实现一个功能就要学习一门语言,这看起来就让人有打退堂鼓的感觉。其实 Lua 并不难学,而且作为本文的场景来说我们不需要去学习 Lua 的完全特性,要在 Redis 中轻量级使用 Lua 语言。这对掌握了 Java 这种重量级语言的你来说根本不算难事。这里胖哥只对 Redis 中的涉及到的基本语法说一说。
Lua 的简单语法
Lua 在 Redis 脚本中我个人建议只需要使用下面这几种类型:
- nil 空
- boolean 布尔值
- number 数字
- string 字符串
- table 表
声明类型
声明类型非常简单,不用携带类型。
--- 全局变量 name = 'felord.cn' --- 局部变量 local age = 18
Redis 脚本在实践中不要使用全局变量,局部变量效率更高。
table 类型
前面四种非常好理解,第五种table需要简单说一下,它既是数组又类似 Java 中的HashMap(字典),它是 Lua 中仅有的数据结构。
数组不分具体类型,演示如下
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > arr_table = {'felord.cn','Felordcn',1} > print(arr_table[1]) felord.cn > print(arr_table[3]) 1 > print(#arr_table) 3
作为字典:
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > arr_table = {name = 'felord.cn', age =