当前位置: 代码迷 >> 综合 >> redis读书笔记六 事务
  详细解决方案

redis读书笔记六 事务

热度:30   发布时间:2023-10-13 18:40:38.0

MULTI, EXEC, DISCARD and WATCH 这几个命令是redis事务的基础。

1、这些命令可以保证事务中的一组命令的下面两个特点:

  • 事务中的命令按输入的顺序执行。在事务执行过程中,其它的命令不能被执行。
  • 要么所有的命令都不执行,要么所有的命令都执行。EXEC 命令一旦执行,则事务中的所有命令都会被执行,否则所有的命令都不会被执行。当使用AOF持久化时,redis会保证一次性写入这些命令,但是如果redis服务器崩溃或管理员使用暴力方式关闭服务,则AOF文件可能只写入一部分命令。如果出现这种情况,那么当redis重启时,AOF文件会报错,此时可以使用redis-check-aof工具修复这个问题,这个工具会清除这部分不完整的事务命令。

2、使用事务,使用MULTI命令开启一个事务,然后就可以输入要执行的命令了,最后输入EXEC命令执行事务。

> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1

3、事务相关的错误

  • 在EXEC执行前,事务中的命令可能会队列化失败。例如语法错误或redis内存溢出等。
  • EXEC执行之后报错,例如事务中的某条命令对string的数据类型执行了lpush操作。

值得注意的是,对于第二种错误,即使事务中的某条命令出错,事务中其他的命令也会被执行,这点和数据库的事务不同。因为redis没有回滚的概念。

4、放弃事务

DISCARD 命令用于放弃一个事务,执行完这个命令,客户端就会退出事务状态。

> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"

5、使用WATCH命令,实现乐观锁

对一些keys执行WATCH命令后,如果在执行WATCH命令前,这些key里有一个key发生变化,则事务会被终止。

举个栗子,假设我们要对一个key的值加1(假设没有INCR命令),可以执行下列命令,保证并发条件下的正确性。

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

如果在WATCH和EXEC命令之间,有其它的客户端修改了key的值,则事务会失败。

6、如何取消对keys的watch

当事务执行完成后,或客户端和redis服务器连接断开后,这些keys就自动UNWATCH了。或者执行UNWATCH命令。

7、使用WATCH实现某些redis不支持的原子性操作

使用WATCH命令实现pop出zset中最小的一个元素

WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC