事务
Redis使用MULTI,EXEC,WATCH等命令来实现事务功能。
MULTI命令标志着事务的开始,相当于Mysql begin
当打开事务功能后,客户端发送的命令会存放到一个事务队列当中。然后向客户端返回QUEUED回复。这与mysql事务不同,mysql事务是接受客户端传来的命令并进行运行,将命令添加到事务日志中,以便后续的回滚操作。
当一个处于事务状态的客户端向服务器发送EXEC命令时(mysql commit),服务器会遍历这个客户端的事务队列,执行队列中保存的所有命令,然后将执行命令所得的结果全部返回给客户端。
所以Redis事务相当于,将客户端的命令打包进行处理,又由于Redis是单线程运行,所以没有并发的问题。
WATCH命令是一个乐观锁(共享锁),可以再EXEC执行前,监视任意数量的数据键,并在EXEC命令执行时,检查被监视的键是否被修改,如果已经早被修改就说明数据不一致,服务器会拒绝执行事务,并返回空回复。
WATCH监视器,是数据库中保存的一个字典。键为被监视的键。值为监视键的客户端,用链表实现。
当服务器修改被监视的键时,会在执行命令后向监视者发送该命令以及参数。
Redis事务不支持回滚机制。即使事务队列中的某个命令在执行期间出现了错误。整个事务也会继续执行下去。
Redis事务本身不支持持久化功能。
当服务器在RDB持久化模式运行时,RDB会保存事务数据,但是由于RDB周期要长所以不适合事务存储。
当在AOF持久化下,appendfsync值为always时,程序会在执行完命令后就将命令持久化文件中,所以这个时候事务也是具有持久的。
当appendfsync为everysec 时。每秒进行持久化一次操作,这个时候有一秒时间是不安全的。

被折叠的 条评论
为什么被折叠?



