命令说明
- 普通命令:只多个原生命令的执行。
- 管道命令:在Redis提供的管道流中多个原生命令一次性发送,并在所有命令执行完一次性获取执行结果(使用限制:多个命令之间不存在返回结果上的依赖)。
- 事务命令:开启事务后执行命令(使用限制:多个命令之间不存在返回结果上的依赖)。
- lua脚本命令:以lua脚本粘合多个原生命令,作为一个整体发送到服务器端执行。
执行流程
- 以下为普通、管道、事务类型命令执行流程的对比图:
-
普通命令:命令->结果、命令->结果;命令会被立即执行,命令与结果之间客户端阻塞,两次命令之间会被其它客户端插入。
-
管道命令:命令->结果缓存、命令->结果缓存,返回结果集合;命令会被立即执行,两次命令之间会被其它客户端插入,见过一次性返回(减少了多次网络传输成本,但是缓存结果会占用服务端的内存资源)。
-
事务命令:命令缓存、命令缓存、执行->返回结果;两次命令缓存之间会被其它客户端插入,执行期间不会被插入。
结果对比
优势
- 相比其它命令,lua脚本命令的优势:
- 减少网络开销 :本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。这点跟管道类似。
- 原子操作 :Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。管道不是原子的,不过redis的批量操作命令(类似mset)是原子的。
- 替代redis的事务功能 :redis自带的事务功能很鸡肋,报错不支持回滚,而redis的lua脚本几乎实现了常规的事务功能,支持报错回滚操作,官方推荐如果要使用redis的事务功能可以用redis lua替代。
- 复用 :客户端发送的脚本永久存在redis中,其他客户端可以复用脚本
- 可嵌入性 :可嵌入JAVA,C#等多种编程语言,支持不同操作系统跨平台交互
劣势
- 需要学习lua脚本语法
注意
- 不要在Lua脚本中出现死循环和耗时的运算,否则redis会阻塞,将不接受其他的命令, 所以使用时要注意不能出现死循环、耗时的运算。redis是单进程、单线程执行脚本。管道不会阻塞redis。