美文网首页
redis eval keys 和 args 区别

redis eval keys 和 args 区别

作者: Yellowtail | 来源:发表于2020-04-29 21:55 被阅读0次

    [TOC]

    背景

    最近工作中有个场景需要使用到 rediseval 命令来执行 lua 脚本

    看到 语法 EVAL script numkeys key [key ...] arg [arg ...]
    有点懵逼
    那我传参的时候,到底是用 keys 来传,还是用 args 呢?

    搜了下资料, 得出了一些结论,分享一下

    官网

    首先看 官网 eval
    也可以看中文的 中文eval

    写着

    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 the KEYS global variable in the form of a one-based array (so KEYS[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支持集群之后,这个脚本可能就会遇到一些问题

    结论

    1. keys 里面建议key, 当然了乱用也没问题
    2. 如果后续redis支持集群了,脚本就可能出问题

    相关文章

      网友评论

          本文标题:redis eval keys 和 args 区别

          本文链接:https://www.haomeiwen.com/subject/wudowhtx.html