美文网首页
redis.call()和redis.pcall()的区别

redis.call()和redis.pcall()的区别

作者: 名字是乱打的 | 来源:发表于2021-09-29 01:16 被阅读0次

redis.call() 与 redis.pcall()很类似, 他们唯一的区别是当redis命令执行结果返回错误时, redis.call()将返回给调用者一个错误,而redis.pcall()会将捕获的错误以Lua表的形式返回

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

要求使用正确的形式来传递键(key)是有原因的,因为不仅仅是 EVAL 这个命令,所有的 Redis 命令,在执行之前都会被分析,籍此来确定命令会对哪些键进行操作。

因此,对于 EVAL 命令来说,必须使用正确的形式来传递键,才能确保分析工作正确地执行

除此之外,使用正确的形式来传递键还有很多其他好处,它的一个特别重要的用途就是确保 Redis 集群可以将你的请求发送到正确的集群节点。 (对 Redis 集群的工作还在进行当中,但是脚本功能被设计成可以与集群功能保持兼容。)不过,这条规矩并不是强制性的, 从而使得用户有机会滥用(abuse) Redis 单实例配置(single instance configuration),代价是这样写出的脚本不能被 Redis 集群所兼容。

来自redis 的官方解释,详细请看http://www.redis.cn/commands/eval.html

相关文章

  • redis.call()和redis.pcall()的区别

    redis.call() 与 redis.pcall()很类似, 他们唯一的区别是当redis命令执行结果返回错误...

  • 9.lua脚本与redis结合

    Redis和Lua结合 1:redis.call:在脚本中调用Redis命令,遇到错误会直接返回 2:redis....

  • Redis通过模糊查询删除keys

    在redis cli下执行:EVAL "return redis.call('del', unpack(redis...

  • redis 分布式锁

    1 实现命令 加锁命令 redis.call 缺点只能作用在一个节点,即使通过sentinel 保证高可用,mas...

  • &和&&,| 和 || 的区别

    &不管前面的条件是否正确,后面都执行 &&前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好。 ...

  • &和&&, |和||的区别

    &和&&的含义一样, 表示逻辑与(and), 只有第一个表达式和第二个表达式都为 true 时, 整个运算结果才为...

  • &&和&,|和||的区别

    1 &&和&的区别 1 单&时,无论左边真假,右边都会进行计算 2 双&&时,只有左边为真时,右边才会进行计算,左...

  • null 和 undefined 的区别 ==和===的区别

    1.null 和 undefined 的区别 undefined 为变量未定义的值undefined表示"缺少值"...

  • is和 == 的区别

    为什么有时写代码 is 和 == 的结果相同,有的不相同呢? 分析: 官方文档中说 is 表示的是对象标示符(ob...

  • is和==的区别

    is 和 == 的区别 id()官网描述 def id(*args, **kwargs): # real sign...

网友评论

      本文标题:redis.call()和redis.pcall()的区别

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