Redis设计与实现知识点总结-事务

事务

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 时。每秒进行持久化一次操作,这个时候有一秒时间是不安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值