Redis事务

一、事务和redis事务

        事务:我们在使用MySQL等关系型数据库时,每当一提到事务我们一定会想到ACID(原子性、一致性、隔离性、持久性)。需要满足这4个特性我们才称之为事务。

        redis事务:它是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序的执行,Redis事务在执行的过程中,不会被其他客户端的请求所打断。

        从定义上看redis事务会将所有命令进行一次打包,执行时不受其他客户端影响。因此它满足隔离性的,redis只对redis语法进行检测,但代码逻辑层面上的错误则不受影响,因此原子性它是不确保的,一致性和原子性是密切相关的,因此一致性也是不能保证,redis持久性取决于redis本身的持久化操作,如果在持久化之前redis服务挂了那么redis数据会存在数据丢失的情况,因此redis事务的持久性也无法保证。

二、Redis事务操作

        redis事务主要涉及到四个命令:multi(开启事务),exec(执行事务),discard(取消事务),watch(监视)

multi命令

multi命令则为开始一个事务,命令执行后可以向redis发送多条命令,然后redis将多个命令入队到事务队列中,此时并不会直接执行这些命令。

 在命令入队时,redis会检查命令的语法是否正确,如果在入队时其中一个命令出现错误,那么整个事务都失败,需要所有的命令重新入队。

exec命令

exec命令执行所有事务块内的命令。

 Redis执行事务是串行的执行事务块里的所有命令,如果其中一条命令出现错误,不会影响后面事务的继续执行,这就是Redis事务不确保原子性。

discard命令

discrd命令取消事务,如果开启事务后发现有异常或者不想执行了则使用discard放弃执行事务块内的所有命令。

 watch命令

watch命令监控在事务过程中是否有其他客户端对一个或多给key进行修改,如果在事务执行之前是否有被修改过,如果有则返回nil。

 unwatch命令

 unwatch命令为取消 WATCH 命令对所有 key 的监视。

三、Redis悲观锁和乐观锁

悲观锁

        每次数据修改之前都对数据先进行加锁,其他客户端都不允许使用该数据,直到操作完成解锁之后其他客户端才能够获取该数据。这种锁效率非常低。

乐观锁

        添加版本控制,对每个数据添加一个版本号,每次数据的读取时不会直接加锁而是记录当时的版本号,如果数据被其他程序修改了的话就会更新成新的版本号,那么在操作数据时会对比版本号是否一致,不一致则不会进行修改。

四、Redis事务的使用场景

Redis事务主要使用在分布式系统和高并发等场景下,具体例如:
1. 用于一些批量操作,将批量的redis命令进行大宝,可以减少redis服务器的通信次数。

2. 分布式锁,在分布式系统中需要实现分布式锁,可以通过redis事务将不同客户端的操作放在同一个事务中进行加锁和解锁的操作。

3.数据库相关操作,例如确保数据库执行操作的先后顺序,就可以把需要执行的操作放在一个事务中让它串行化执行,还有就是对数据库迁移操作可以通过redis事务报缺数据库在迁移过程中出现异常情况。

总结

        redis事务并不能严格按照事务特性来对其进行理解和定义,同时redis事务也没有回滚机制,因此在使用事务时需要针对回滚的操作进行单独的处理,redis事务能够确保你的操作命令的串行化,按照你入队的顺序一次执行你想要的操作,同时对其他操作是隔离的,而redis本身是支持持久化的如果因此它一定程度上是满足一致性的要求。

        具体使用需根据真实业务场景进行选择,不可盲目信任,也不可以盲目抛弃。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值