redis 事务

Jackey Redis 3,141 次浏览 , 1条评论

事务

Redis 的事务功能允许用户将多个命令包裹起来,然后一次性地、按 顺序地执行被包裹的所有命令。保证部分的原子性。
Redis已经子系统内部进行了功能的简化,这样可以保证更快的运行速度,因为Redis不需要事务的回滚能力。
在事务执行的过程中,服务器不会中断事务而改去执行其他命令请求,只有在事务包裹的所有命令都被执行完毕之后,服务器才会去处理其他命令请求。

事务命令

MULTI 开始一个新的事务。
DISCARD 放弃事务。
EXEC 执行事务中的所有命令。

开始事务

MULTI
开始一个事务。
在这个命令执行之后,客户端发送的所有针对数据库或者数据库键的命令都不会被立即执行,而是被放入到一个事务队列里面,并返回 QUEUED 表示命令已入队。
redis> MULTI # 开始一个事务
OK
redis> SET msg "hello world" # 将这个 SET 命令放入事务队列
QUEUED
redis> EXPIRE msg 10086 # 将这个 SET 命令放入事务队列
QUEUED

放弃事务

DISCARD
取消事务,放弃执行事务队列中的所有命令。复杂度为 O(1)。
redis> MULTI
OK
redis> SET msg "hello world"
QUEUED
redis> EXPIRE msg 10086
QUEUED
redis> DISCARD # 事务已被取消
OK
redis> SET msg "hello world"
OK

执行事务

EXEC
按照命令被入队到事务队列中的顺序,执行事务队列中的所有命令。
命令的复杂度为队列中所有命令的复杂度之和。
命令的返回值是一个列表,列表里包含了事 务队列中所有被执行命令的返回值。
redis> MULTI
OK
redis> SET msg "hello world"
QUEUED
redis> EXPIRE msg 10086
QUEUED
redis> EXEC
1) OK # SET 命令的返回值
2) (integer) 1 # EXPIRE 命令的返回值

WATCH 命令

WATCH key [key ...]
如果被监视的键在事务提交之前(也即是 EXEC 命令执行之前), 已经被其他客户端抢先修改了, 那么服务器将拒绝执行客户端提交的事务, 并返回 nil 作为事务的回复:
redis> WATCH msg # 监视键 msg
OK
redis> MULTI
OK
redis> SET msg "hello world"
QUEUED
redis> EXEC # 在这个事务之前,已经有其他客户端对键 msg 进行了修改
(nil)

和乐观锁有关的其他命令

UNWATCH 取消对所有键的监视。
DISCARD 放弃执行事务,并且取消对所有键的监视(相当于执行 UNWATCH)

redis> WATCH msg name fruits # 监视三个键
OK
redis> UNWATCH # 取消对上面三个键的监视
OK

乐观锁和悲观锁的区别

乐观锁会对被加锁的数据进行监视,多个客户端可以同时尝试对数据进行修改,其中最先尝试的客户端会成功,而之后尝试的客户端则会失败。
悲观锁只让一个客户端对数据进行修改,而其他客户端则需要等待正在进行修改的客户端执行完毕之后,才能尝试获得修改权。
对于频繁进行读写操作的 Redis 来说,使用乐观锁可以避免客户端被阻塞:当一个客户端修改数据失败之后,它只要重试就可以了,这个过程不需要进行任何的等待。

一条评论

  1. 李传龙 2020年5月8日 上午11:58 回复

    学习了

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go