[TOC]
背景
最近工作中有个场景需要使用到 redis
的 eval
命令来执行 lua
脚本
看到 语法 EVAL script numkeys key [key ...] arg [arg ...]
有点懵逼
那我传参的时候,到底是用 keys
来传,还是用 args
呢?
搜了下资料, 得出了一些结论,分享一下
官网
写着
The second argument of EVAL is the number of arguments that follows the script (starting from the third argument) that represent Redis key names.
The arguments can be accessed by Lua using theKEYS
global variable in the form of a one-based array (soKEYS[1]
,KEYS[2]
, ...).
中文
EVAL的第二个参数是参数的个数,后面的参数(从第三个参数),表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
所以, redis
建议大家在 keys
存储 redis
里的键 key
那么为什么呢?
区别
然后官网举了个例子
> eval "return redis.call('set','foo','bar')" 0
> OK
官网是这样解释的
All Redis commands must be analyzed before execution to determine which keys the command will operate on. In order for this to be true for EVAL, keys must be passed explicitly. This is useful in many ways, but especially to make sure Redis Cluster can forward your request to the appropriate cluster node.
Note this rule is not enforced in order to provide the user with opportunities to abuse the Redis single instance configuration, at the cost of writing scripts not compatible with Redis Cluster.
中文
要求使用正确的形式来传递键(key)是有原因的,因为不仅仅是 EVAL 这个命令,所有的 Redis 命令,在执行之前都会被分析,籍此来确定命令会对哪些键进行操作。
因此,对于 EVAL 命令来说,必须使用正确的形式来传递键,才能确保分析工作正确地执行。 除此之外,使用正确的形式来传递键还有很多其他好处,它的一个特别重要的用途就是确保 Redis 集群可以将你的请求发送到正确的集群节点。 (对 Redis 集群的工作还在进行当中,但是脚本功能被设计成可以与集群功能保持兼容。)不过,这条规矩并不是强制性的, 从而使得用户有机会滥用(abuse) Redis 单实例配置(single instance configuration),代价是这样写出的脚本不能被 Redis 集群所兼容。
可能有点长,我用我的理解来解释一下
就是说,Redis
后续可能要开发基于集群模式的, 在集群模式下,很可能就涉及到 数据分节点存储的问题
如果在语法上,直接告诉 Redis
我用到了那些key
, 那么redis
就能在脚本运行前做一些准备工作,比如: 去哪个节点执行脚本
当然了,目前都是单实例的,瞎用的话,redis
也没有做什么限制, 也是能正常运行的
只是,一旦后续redis
支持集群之后,这个脚本可能就会遇到一些问题
结论
-
keys
里面建议
放key
, 当然了乱用也没问题 - 如果后续
redis
支持集群了,脚本就可能出问题
网友评论