Redis客户端执行一次命令,需要经历发送命令、命令排队、命令执行、返回结果四个过程。4个过程统称为一次Round Trip Time (RRT,往返时间)
Pipeline(流水线)机制能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端
性能测试:
执行速度一般比逐条执行要快,
客户端和服务端的网络延迟越大,Pipeline的效果越明显
原生批量命令和Pipeline对比。
原生批量命令是原子的,Pipeline是非原子的。
原生批量命令是一个命令对应多个key,Pipeline支持多个命令。
原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。
最佳实践
一次组装Pipeline数据量过大, 一方面会增加客户端的等待时间, 另一方面会造成一定的网络阻塞, 可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成
Pipeline只能操作一个Redis实例,但是即使在分布式Redis场景中,也可以作为批量操作的重要优化手段。
简单事务功能:将一组需要一起执行的命令放到multi(事务开始)和exec(事务结束)命令之间的命令,能够原子顺序执行。
停止事务用discard代替exec命令即可。
watch命令,是事务执行之前,确保事务中的key没有被其他客户端修改过,修改过的话就不执行事务。类似于乐观锁。
Redis的事务比较简单,无法保证事务回滚,无法实现事务内命令之间的逻辑运算
Lua 教程:https://www.runoob.com/lua/lua-tutorial.html
Redis中使用Lua
eval 脚本内容 key个数 key列表 参数列表
首先要将Lua脚本加载到Redis服务端,得到该脚本的SHA1校验和,evalsha命令使用SHA1作为参数可以直接执行对应Lua脚本,避免每次发送Lua脚本的开销。这样客户端就不需要每次执行脚本内容,而脚本也会常驻在服务端,脚本功能得到了复用。
script load
加载脚本:将脚本内容加载到Redis内存中,得到SHA1evalsha 脚本SHA1值 key个数 key列表 参数列表
执行脚本:将传入参数SHA1值,执行对应的Lua脚本redis.call
函数实现对Redis的访问redis-cli -a password script load 'redis.call("set","hello","world") return redis.call("get","hello")'
# 返回sha1: "317adb9b83d8b5df45f0bc67609674b0ae930a62"
127.0.0.1> evalsha f25d77be007f76dbce293d457128571799d159b9 0
好处
Redis管理Lua脚本
script load # 将Lua脚本加载到Redis内存中
scripts exists sha1 [sha1 …] # 判断sha1是否已经加载到Redis内存中
script flush # 清除Redis内存已经加载的所有Lua脚本
script kill #杀掉正在执行的Lua脚本。如果此时lua脚本阻塞redis了,可以使用此命令快速将脚本杀掉。如果正在执行的是写操作,script kill 将不会生效,只能通过shutdown save停掉redis服务。