EVAL script numkeys [key [key ...]] [arg [arg ...]]
一、EVAL的介绍
EVAL和EVALSHA使用Redis 2.6.0版本开始内置的Lua解释器来运行脚本。
EVAL的第一个参数是Lua 5.1脚本。 该脚本不需要定义 Lua 函数(也不应该)。 它只是一个将在 Redis 服务器的上下文中运行的 Lua 程序。
EVAL 的第二个参数是脚本后面的参数数量,从第三个参数开始代表Redis的键名。Lua 可以使用 KEYS 全局变量以数组下标的形式访问这些参数(所以 KEYS[1], KEYS[2], …)。
所有额外的参数不应该代表键名并且可以被 Lua 使用 ARGV 全局变量访问,与键发生的情况非常相似(所以 ARGV[1], ARGV[2], …)。
举例:
> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
注意: Lua 数组作为 Redis 多批响应返回,这是一种 Redis 返回类型,你的客户端库可能会在你的编程语言中将其转换为 Array 类型。
使用两个不同的 Lua 函数从 Lua 脚本调用 Redis 命令:
- redis.call()
- redis.pcall()
redis.call() 会引发 Lua 错误,进而迫使 EVAL 返回错误给命令调用者,而 redis.pcall 将捕获错误并返回表示错误的 Lua Table。
redis.call() 和 redis.pcall() 函数的参数都是格式良好的 Redis 命令的参数:
> eval "return redis.call('set','foo','bar')" 0
OK
上面的脚本将键 foo 设置为字符串 bar。 然而,它违反了 EVAL 命令语义,因为脚本使用的所有键都应该使用 KEYS 数组传递。
> eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK
在执行之前必须分析所有 Redis 命令,以确定该命令将操作哪些键。为了使这个是正确的,必须显式传递键。 这在很多方面都很有用,但特别是要确保 Redis 集群可以将您的请求转发到适当的集群节点。
请注意,此规则不是为了让用户有机会滥用 Redis 单实例配置而强制执行的,代价是编写与 Redis 集群不兼容的脚本。
Lua 脚本可以使用一组转换规则返回一个从 Lua 类型转换为 Redis 协议的值。
二、Lua和Redis数据类型之间的转换
三、返回 Redis 类型的辅助函数
四、脚本的原子性
五、错误处理
六、在低内存情况下运行Lua
七、Bandwidth and EVALSHA
八、脚本缓存语义
九、脚本命令
十、具有确定性写入的脚本
|