文章目录
  1. 04_Redis之事务与Lua
  2. 1. 事务
    1. 1.1 使用
    2. 1.2 错误
      1. 1.2.1 命令错误
      2. 1.2.2 运行时错误
      3. 1.2.3 watch命令
    3. 1.3 总结
  3. 2. Lua脚本

[TOC]

04_Redis之事务与Lua

1. 事务

之前学习的Pipeline,但是Pipeline执行命令的过程并不是原子性的。所以为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。

1.1 使用

Redis提供了简单的事务功能,将一组需要一起执行的命令放在multiexec两个命令之间。

  • multi 代表事务的开始
  • exec 代表事务的结束
  • discard 终止事务

示例

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sadd users user1 user2
QUEUED
127.0.0.1:6379> sadd users user3
QUEUED
127.0.0.1:6379> exec
1) (integer) 2
2) (integer) 1

注意:如果在执行exec之前,执行sismember users user1命令的话,结果会返回不存在。

如果需要停止事务,可以使用discard代替exec命令即可。

1.2 错误

如果事务中出现错误,Redis的处理也不尽相同

1.2.1 命令错误

比如在事务的过程将set写成了sett,属于语法错误,会造成整个事务无法执行。所以进入QUEUE的操作都不会生效。

1.2.2 运行时错误

比如在执行sadd命令时候,误写成了zadd命令,这种就会在运行时报错。

但是在最后执行exec的时候,并不支持回滚的操作,这里需要开发人员注意一下。

1.2.3 watch命令

有些场景下,需要确保事务的中key没有被其他客户端修改过,才能执行事务,否则不执行(类似于乐观锁)。Redis提供了watch来解决这类问题。

这里可以看到客户端1在执行exec的时候并不会生效,返回的是nil

1.3 总结

Redis提供的是简单的事务功能,并不支持回滚特性,同时无法实现命令之间的逻辑关系。后面使用Lua脚本也可以实现事务的功能,并且Lua的功能要强大很多。

2. Lua脚本

Lua的简介和基本语法可以参考:https://coolshell.cn/articles/10739.html

文章目录
  1. 04_Redis之事务与Lua
  2. 1. 事务
    1. 1.1 使用
    2. 1.2 错误
      1. 1.2.1 命令错误
      2. 1.2.2 运行时错误
      3. 1.2.3 watch命令
    3. 1.3 总结
  3. 2. Lua脚本