从 Redis 2.6 版本开始,Redis 使用内置的 Lua 解释器执行脚本,这意味着我们可以直接在 Redis 客户端执行Lua 脚本 ,于此同时 Redis 还非常贴心地提供了用于编写 Lua 脚本的EVAL
命令。
第一个Lua脚本命令
Lua 是一种轻量小巧、开源的脚本语言,用标准 C语言编写。其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它被广泛的应用于:游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件等。
Redis 使用EVAL
命令编写 lua 脚本,其语法格式如下:
127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
参数说明如下:
- script: 该参数表示使用 Lua 语言编写的一段脚本程序,该脚本不必定义为 Lua 函数格式;
- numkeys: 用于指定 key 参数的数量;
- key [key …]: 从 EVAL 命令的第三个参数算起,表示脚本中用到的所有 key。这些 key 可以使用全局变量 KEYS 数组来访问,比如 KEYS[1] 、KEYS[2] 以此类推。
- arg [arg …]:表示附加参数,在 Lua 语言中通过全局变量 ARGV 数组访问,访问的形式与 KEYS 数组相同,比如 ARGV[1] 、 ARGV[2]。
举一个简单的示例:在 Redis 客户端使用 Lua 语言编写“Hello World”并将其输出。
127.0.0.1:6379> EVAL "return 'Hello world'" 0
"Hello world"
为什么使用Lua脚本
虽然 Redis 官网提供了丰富指令集(200多个),但是在某些特定的领域需要对指令进行扩充,因此 Redis 允许我们使用 Lua 语言以自定义的方式编写脚本命令,这满足了一部分用户的需求。Redis 服务器会以单线程、原子性的方式执行 Lua 脚本,保证 Lua 脚本在处理过程中不会被其他请求中断。
使用 Lua 脚本有如下好处:
- 减少网络开销:可以将多个请求通过脚本的形式一次发送,从而减少网络时延,比如本来 10 次网络请求,我们就可以通过 Lua 脚本一次性完成。
- 原子操作:Redis 会将整个脚本作为一个整体执行,中间不会被其他请求干扰。因此在脚本运行过程中无需使用事务。
- 脚本复用:客户端发送的脚本会一直存储在 Redis 中,这样其他客户端只需对这个脚本稍作修改就可以达到复用的目的,极大地提升了编写脚本的效率。
常用脚本命令
命令 | 说明 |
---|---|
EVAL script numkeys key [key …] arg [arg …] | 使用 Lua 解释器执行脚本。 |
EVALSHA sha1 numkeys key [key …] arg [arg …] | Lua 解释器根据 sha1 校验码执行脚本。 |
SCRIPT EXISTS script [script …] | 查看指定的脚本是否保存在于缓存当中。 |
SCRIPT FLUSH | 从脚本缓存中移除所有脚本。 |
SCRIPT KILL | 杀死当前正在运行的 Lua 脚本。 |
SCRIPT LOAD script | 将脚本 script 添加到脚本缓存中,但不马上执行这个脚本。 |
基本命令应用
EVAL 命令使用示例:
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/280150.html