Redis 事务与 Lua 脚本语言

Posted by icoding168 on 2020-04-17 02:47:49

分类: Redis  

Redis 事务

Redis 提供了简单的事务功能,将一组需要一起执行的命令放到 multi 和 exec 两个命令之间即可执行事务。

multi 命令代表事务开始,exec 命令代表事务结束,在它们之间执行的命令具有原子性。

discard 命令用于取消一个事务, 它清空客户端的整个事务队列, 然后将客户端从事务状态调整回非事务状态, 最后返回字符串 OK 给客户端, 说明事务已被取消。

Redis 的事务是不可嵌套的, 当客户端已经处于事务状态, 而客户端又再向服务器发送 multi 时, 服务器只是简单地向客户端发送一个错误, 然后继续等待其他命令的入队。

有些应用场景需要在事务开始前确保事务中的 key 没有被其它客户端修改过,没有修改过才能执行事务,也就是类似乐观锁的过程。Redis 提供了 watch 命令来解决这一类问题:

上图中客户端 1 的事务执行完之后, 得到的值是客户端 2 赋予的值。

Redis 的事务比起 MySQL 来说是很简单的,因为 Redis 的事务没有高级的并发控制机制,而且也不支持回滚。

Lua 脚本语言

Lua 是由 C 语言实现的脚本语言,简单小巧但功能强大。

Lua 提供了 booleans、numbers、strings、tables 等数据类型,tables 可以当作数组来用,也可以当作哈希表来用。与大多数语言不同的是,Lua 的数组下标是从 1 开始的。

在 Redis 中执行 Lua 有两种方法:eval 和 evalsha,eval 命令和 --eval 参数本质是一样的,而 evalsha 命令可以让 Lua 脚本常驻在服务端,让脚本的功能得到复用。eval 命令类似 MySQL 的 Statement ,而 evalsha 命令类似 MySQL 的 PreparedStatement。

Redis 提供了 4 个命令来管理 Lua 脚本:script load,script exists,script flush,script kill,分别用于加载脚本,判断脚本是否已经加载,清除所有 Lua 脚本,杀掉正在执行的 Lua 脚本。

Lua 脚本的优点:

  • Lua 脚本可以将多条命令一次性打包,减少网络开销
  • Lua 脚本可以常驻在内存中,实现代码逻辑的复用
  • Lua 脚本在 Redis 中是原子执行的