《Redis开发与运维》----- Pipeline(流水线、管道)、事务与Lua

Pipeline(流水线、管道)

  • Redis客户端执行一次命令,需要经历发送命令、命令排队、命令执行、返回结果四个过程。4个过程统称为一次Round Trip Time (RRT,往返时间)

  • Pipeline(流水线)机制能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端

  • 性能测试:
    执行速度一般比逐条执行要快,
    客户端和服务端的网络延迟越大,Pipeline的效果越明显

  • 原生批量命令和Pipeline对比。

    原生批量命令是原子的,Pipeline是非原子的。
    原生批量命令是一个命令对应多个key,Pipeline支持多个命令。
    原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。

  • 最佳实践
    一次组装Pipeline数据量过大, 一方面会增加客户端的等待时间, 另一方面会造成一定的网络阻塞, 可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成
    Pipeline只能操作一个Redis实例,但是即使在分布式Redis场景中,也可以作为批量操作的重要优化手段。

事务与Lua

事务

简单事务功能:将一组需要一起执行的命令放到multi(事务开始)和exec(事务结束)命令之间的命令,能够原子顺序执行。

停止事务用discard代替exec命令即可。

watch命令,是事务执行之前,确保事务中的key没有被其他客户端修改过,修改过的话就不执行事务。类似于乐观锁。

Redis的事务比较简单,无法保证事务回滚,无法实现事务内命令之间的逻辑运算

Lua语法

Lua 教程:https://www.runoob.com/lua/lua-tutorial.html

Redis中使用Lua
  1. eval 执行lua脚本 eval 脚本内容 key个数 key列表 参数列表
  2. redis-cli --eval 如果Lua脚本比较长,还可以使用redis-cli --eval 直接执行文件。eval命令和–eval参数本质一样。
  3. evalsha

首先要将Lua脚本加载到Redis服务端,得到该脚本的SHA1校验和,evalsha命令使用SHA1作为参数可以直接执行对应Lua脚本,避免每次发送Lua脚本的开销。这样客户端就不需要每次执行脚本内容,而脚本也会常驻在服务端,脚本功能得到了复用

  • script load 加载脚本:将脚本内容加载到Redis内存中,得到SHA1
  • evalsha 脚本SHA1值 key个数 key列表 参数列表 执行脚本:将传入参数SHA1值,执行对应的Lua脚本
  • 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
好处
  • Lua脚本在Redis中是原子执行的,执行过程中间不会插入其他命令
  • Lua脚本可以自定义命令,并可以将这些命令常驻在Redis内存中,实现复用的效果。
  • Lua脚本可以将多条命令一次性打包,有效地减少网络开销。
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服务。

你可能感兴趣的:(Redis)