在《Redis 设计与实现》一书中,第13章关于伪客户端的描述:
Lua脚本的伪客户端:服务器会在初始化时创建负责执行Lua脚本中包含的Redis命令的伪客户端,并将这个伪客户端关联在服务器状态结构的lua_client属性中。lua_client伪客户端在服务器运行的整个生命期中会一直存在,只有服务器被关闭时,这个客户端才会被关闭。
AOF文件的伪客户端:服务器在载入aof文件时,会创建用于执行AOF文件包含的redis命令的伪客户端,并在载入完成之后,关闭这个伪客户端。
问题:为什么lua_client伪客户端在服务器运行的整个生命期中会一直存在?
在查了些资料后,个人关于 lua_client 的生命周期的理解是这样的:
版本:自2.6.0起可用。
时间复杂度:取决于执行的脚本。
使用Lua脚本的好处:
- 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。
- 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。
- 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。
(以上参考来源:Redis如何使用lua脚本实例教程-面圈网)
因为Redis使用串行化的方式来执行Redis命令,所以在任何特定时间里,最多都只会有一个脚本能够被放进Lua环境里面运行,因此,整个Redis服务器只需要创建一个Lua环境即可。(第20章 Lua脚本)
lua_client伪客户端作为Lua环境的协作组件之一,主要功能就是处理Lua脚本中包含的所有Redis命令。因为脚本执行可能是个频繁的操作,当需要的时候不必每次执行都重新创建客户端,所以就会一直保留,直到服务器关闭。