Redis Lua脚本

EVAL

  用于使用Redis内置的Lua解析器解析脚本。

  键参数可以使用 KEYS 访问,如 KEYS[1]KEYS[2]...

  值参数可以使用 ARGV 访问,如 ARGV[1]ARGV[2]...

  Lua脚本调用Redis命令   

redis.call()
redis.pcall()

    两者之间唯一的不同是错误的返回形式

脚本的原子性

  Redis使用相同的Lua解释器来运行所有命令。另外,Redis保证以原子方式执行脚本:执行脚本时不会执行其他脚本或Redis命令。这种语义类似于Redis事务。

EVALSHA

  EVAL命令会每次将脚本内容发送给Redis实例,Redis不需要每次都重新编译脚本,因为它使用内部缓存机制,但是在许多情况下,支付额外网络带宽的成本可能不是最优的。

  EVALSHA的工作原理与EVAL完全相同,但是它没有脚本作为第一个参数,而是具有脚本的SHA1摘要。

  即使客户端实际调用EVAL,客户端库实现也始终可以乐观地发送EVALSHA,以希望脚本已被服务器看到。如果返回错误,将使用EVAL代替。NOSCRIPT在这种情况下,将键和参数作为附加的EVAL参数传递也是非常有用的,因为脚本字符串保持不变,并且Redis可以有效地对其进行缓存

脚本缓存机制

  确保已执行的脚本永远位于Redis实例的给定执行的脚本缓存中。这意味着,如果对Redis实例执行EVAL,则所有后续的EVALSHA调用都会成功。

  刷新脚本缓存的唯一方法是显式调用SCRIPT FLUSH命令

  一种常见的模式是调用SCRIPT LOAD来加载将出现在管道中的所有脚本

全局变量保护

  Redis脚本不允许创建全局变量,为了避免在脚本中使用全局变量,只需使用local关键字声明要使用的每个变量

作用

  事务形式执行命令不会引起任何竞争

  脚本可重用重复执行相同的操作时,只要调用服务内部的脚本缓存即可

  事务形式操作自定义的Redis命令,如取出列表中数值为偶数的值,并存入到新的列表中

猜你喜欢

转载自www.cnblogs.com/BINGJJFLY/p/12329144.html