Redis之事务

        Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制。

事务实现

        一般事务实现分为三个步骤:事务开始、命令入队和事务执行。其中MULTI命令则表示事务开始,而后便可输入一些读写命令,最后EXEC命令则表示执行事务。命令入队时,Redis将命令放到一个队列中,而执行时,则按照先进先出的顺序执行命令·队列。如下所示:

         观察以上实例可以看出,在multi命令开始事务之后,exec命令执行事务之前,所有的命令都是返回QUEUED,表示命令入队,当输入exec命令之后,从返回结果可以看出,是依次执行命令队列的命令的。

watch命令

        watch命令是一个乐观锁,它可以在exec命令执行之前,监视人意数量的数据库键,并在exec命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。如果键被修改,那么键对应的客户端的REDIS_DIRTY_CAS标识打开。如果客户端的REDIS_DIRTY_CAS标识已经被打开,那么说明客户端监视的键中,至少有一个被修改过了,所以服务器会拒绝执行客户端提交的事务。

        如下图所示,有两个客户端。

        现在对其中一个键进行监督,并实现一个事务,在exec之前做两种操作进行对比,1)什么都不做,2)在另一个客户端对监督的键进行修改 。执行结果如下图所示:

        以上两者对比可以看出,watch机制是如何保证数据的安全性的。 

 事务的ACID性质

原子性:Redis事务队列中的命令要么全部都执行,要么一个都不执行。下面的例子则体现了原子性。前者全部执行,后者由于一个命令出错导致全都不执行。

一致性:无论事务是否成功执行,数据库状态始终处于一个一致性状态。

隔离性:因为Redis是使用单线程的方式执行事务的,相当于关系数据库中的串行化隔离级别,因此Redis事务是具有隔离性的。

持久性:当一个事务执行完毕时,执行这个事务所得的结果已经被保存到永久性存储介质里面了,即使服务器在事务执行完毕之后停机,执行事务

所得的结果也不会丢失。但Redis持久化方式中,涉及数据的损失,所以只有当使用AOF持久化,并且将appendfsync 设置为always才是具有持久性的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值