Redis中的Lua脚本(六)

Lua脚本

清空repl_scriptcache_dict字典

每当主服务器添加一个新的从服务器时,主服务器都会清空自己的repl_scriptcache_dict字典,这是因为随着新从服务器的出现,repl_scriptcache_字典里面记录的脚本已经不再被所有从服务器载入过,所以主服务器会清空repl_scirptcache_dict字典,强制自己重新向所有从服务器传播脚本,从而确保新的从服务器不会出现脚本未找到错误。

EVALSHA命令转换成EVAL命令的方法

通过使用EVALSHA命令指定的SHA1校验和,以及lua_scripts字典保存的Lua脚本,服务器总可以将一个EVALSHA命令:

EVALSHA <sha1> <numkeys> [key ...] [arg...]

转换成一个等价的EVAL命令:

EVAL <script> <numkeys> <key ...> <arg ...>

具体的转换方法如下:

  • 1.根据SHA1校验和sha1,在lua_scripts字典中查找sha1对应的Lua脚本script
  • 2.将原来的EVALSHA命令请求改写成EVAL命令请求,并且将校验和sha1改成脚本script,至于numkeys、key、arg等参数则保持不变

例子

  • 举个例子。对于图中所示的lua_scripts字典,以及如图所示的repl_scriptcache_dict字典来说,总可以将命令:
EVALSHA "5332031c6b470dc5a0dd9b4bf2030dea6d65de91" 0

改写成命令:

EVAL "return 'hello world' 0"

其中脚本的内容:

"return 'hello world'"

来源于lua_scripts典"5332031c6b470dc5a0dd9b4bf2030dea6d65de91"键的值。如果一个SHA1值所对应的Lua脚本没有被所有从服务器载入过,那么主服务器可以将EVALSHA命令转换成等价的EVAL命令,然后通过传播等价的EVAL命令来代替原本想要传播的EVALSHA命令,以此来产生相同的脚本执行结果,并确保所有从服务器都不会出现脚本未找到错误。另外,因为主服务器在传播完EVAL命令之后,会将被传播脚本的SHA1校验和(也即是EVALSHA命令指定的那个校验和)添加到repl_scriptcache_dict字典里面,如果之后EVALSHA命令再次指定这个SHA1校验和,主服务器就可以直接传播EVALSHA命令,而不必再次对EVALSHA命令进行转换

在这里插入图片描述
在这里插入图片描述

传播EVALSHA命令的方法。

当主服务器成功在本机执行完一个EVALSHA命令之后,它将根据EVALSHA命令指定的SHA1校验和是否存在于repl_scriptcache_dict字典来决定是向从服务器传播EVALSHA命令还是EVAL命令:

  • 1.如果EVALSHA命令指定的校验和存在于repl_scriptcache_dict字典,那么主服务器直接向从服务器传播EVALSHA命令
  • 2.如果EVALSHA指定的SHA1校验和不存在于repl_scriptcache_dict字典,那么主服务器会将EVALSHA命令转换成等价的EVAL命令,然后传播这个等价的EVAL命令,并将EVALSHA命令指定的SHA1校验和添加到repl_scriptcache_dict字典里面
    在这里插入图片描述

例子

  • 举个例子。假设服务器当前lua_scripts字典和repl_scriptcache_dict字典的状态如上图所示,如果客户端向主服务器发送命令:
EVALSHA "5332031c6b470dc5a0dd9b4bf2030dea6d65de91" 0

那么主服务器在执行完这个EVALSHA命令之后,会将这个EVALSHA命令转换成等价的EVAl命令:

EVAL "return 'hello world'" 0

并向所有从服务器传播这个EVAL命令。除此之外,主服务器还会将SHA1校验和"5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
添加到repl_scriptcache_dict字典里,这样当客户端下次再发送命令:

EVALSHA "5332031c6b470dc5a0dd9b4bf2030dea6d65de91" 0

的时候,主服务器就可以直接向从服务器传播这个EVALSHA命令,而无须将EVALSHA命令转换成EVAL命令再传播。
添加"5332031c6b470dc5a0dd9b4bf2030dea6d65de91"之后的repl_scriptcache_dict字典如图所示:
在这里插入图片描述

相关推荐

  1. RedisLua脚本(一)

    2024-04-22 06:20:02       37 阅读
  2. lua脚本基本语法,以及Redis简单使用

    2024-04-22 06:20:02       66 阅读
  3. Lua脚本Redis高效应用

    2024-04-22 06:20:02       73 阅读
  4. Redislua脚本和pipeline区别

    2024-04-22 06:20:02       27 阅读
  5. Redis使用Lua脚本

    2024-04-22 06:20:02       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 06:20:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 06:20:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 06:20:02       82 阅读
  4. Python语言-面向对象

    2024-04-22 06:20:02       91 阅读

热门阅读

  1. python国内的镜像源记录

    2024-04-22 06:20:02       31 阅读
  2. 图像和图像处理

    2024-04-22 06:20:02       33 阅读
  3. 左值引用与右值引用

    2024-04-22 06:20:02       32 阅读
  4. 创建socket服务端和客户端--通信(简单入门)

    2024-04-22 06:20:02       33 阅读
  5. yarn的安装与配置(Windows/macOS)

    2024-04-22 06:20:02       32 阅读
  6. 记录mac上图像处理

    2024-04-22 06:20:02       39 阅读