2023-06-09:什么是Redis事务?原理是什么?

2023-06-09:什么是Redis事务?原理是什么?

答案2023-06-09:

Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令,而且所有命令都会按照指定的顺序经过序列化后被执行。在服务端执行事务的过程中,不受其他客户端发送给Redis的命令请求的干扰影响。

Redis 事务的注意点有哪些?

Redis事务的使用需要注意以下几点:

1.Redis 事务不支持回滚,不能像 MySQL 的事务那样可以选择性地输出。一旦命令提交给Redis,就会被执行,无法扔回到事务的起点。

2.Redis事务是原子执行的,要么全部执行成功,要么放弃执行。如果其中一个命令失败,则整个事务都会失败,但不会因为其中一个命令失败而导致其他命令的执行效果不确定。

3.执行事务期间,Redis服务器不会中断执行,也不会被其他客户机的请求干扰,这保证了事务操作期间的隔离性和原子性。

4.事务中的命令都是串行执行的,并且事务会尽量缩短命令合并的时间。如果有多个客户端同时访问同一个命令,会根据请求的时间顺序进行处理,避免了竞争和死锁。

Redis 事务为什么不支持回滚?

Redis事务执行期间不支持回滚的主要原因是为了避免增加复杂的实现逻辑和增加系统负担。 Redis只能通过在事务提交前执行所有命令来保证原子性的特性。如果Redis支持回滚,则必须存储事务执行前的状态,并在回滚后重置状态,这样会增加显著的存储和计算负担。

当命令执行期间发生语法错误等问题,Redis会在执行失败时报错,开发人员可以通过编写代码来处理这些错误。但是出现严重问题时,如网络故障或硬件问题等,Redis仍然会执行已经提交的事务命令,此时数据可能会出现严重不一致,需要开发人员自行修复。

总之,虽然没有回滚功能,但是Redis事务仍然是非常有用和实用的功能,能够提供高效、快速和可靠的多命令操作。开发人员需谨慎处理错误处理方式和保证数据一致性,以获得最佳实践的体验。

事务

事务是一组操作或动作的集合,这些操作要么全部执行,要么全部不执行。在执行事务期间,可以保证隔离性和原子性,即在同一事务中执行的操作相互独立,不受其他事务的干扰。如果其中一个操作发生错误,则仅回滚该事务,而不影响其他事务的执行结果。事务通常用于需要一系列操作来完成的任务,例如向数据库中插入多个数据,或将多个操作组合成一个原子操作。

以社交网站上用户A关注用户B为例,这个动作需要在用户A的关注表中添加用户B,并在用户B的粉丝表中添加用户A。将这两个操作组合成事务,可以确保在同一个事务中执行,要么全部执行,要么全部不执行。这样可以避免出现数据不一致的情况,确保关注关系的正确性。使用事务可以将多个数据库操作组合成一个原子操作,保证数据的一致性。

Redis提供了简单的事务功能,以multi命令开始事务,并在调用exec命令结束事务。将需要一起执行的命令放在multi和exec之间,Redis会将这些命令作为一个原子操作来处理,要么全部执行,要么全部不执行。如果在事务执行期间需要取消已经执行的命令,可以使用discard命令回滚整个事务。利用Redis的事务功能,可以执行多个命令并确保它们在同一个事务中执行,避免了因单个命令执行失败而导致的数据不一致问题。

一个客户端

image.png

另外一个客户端

在事务没有提交的时查询(查不到数据)

image.png

在事务提交后查询(可以查到数据)

image.png

可以看到sadd命令此时的返回结果是QUEUED,代表命令并没有真正执行,而是暂时保存在Redis中的一个缓存队列(所以discard也只是丢弃这个缓存队列中的未执行命令,并不会回滚已经操作过的数据,这一点要和关系型数据库的Rollback操作区分开)。

只有当exec执行后,用户A关注用户B的行为才算完成,如下所示exec返回的两个结果对应sadd命令。

但是要注意Redis的事务功能很弱。在事务回滚机制上,Redis只能对基本的语法错误进行判断。

如果事务中的命令出现错误,Redis 的处理机制也不尽相同。

1、语法命令错误

image.png

例如下面操作错将set写成了sett,属于语法错误,会造成整个事务无法执行,事务内的操作都没有执行:

2、运行时错误

例如:事务内第一个命令简单的设置一个string类型,第二个对这个key进行sadd命令,这种就是运行时命令错误,因为语法是正确的:

image.png

可以看到Redis并不支持回滚功能,第一个set命令已经执行成功,开发人员需要自己修复这类问题。

Redis的事务原理

Redis的事务是在服务器端实现的,当用户执行MULTI命令时,服务器将对应的客户端对象设置为一个专门的状态,此状态下所有后续用户所执行的查询命令都不会被立即执行,而是被保存在一个事务队列中,直到用户执行EXEC命令为止。在执行EXEC命令前或在事务途中,客户端可以随时调用DISCARD命令来取消事务。当用户执行EXEC命令时,服务器会将该客户端对象中缓存的命令按照它们提交的顺序依次执行,并将执行结果返回给客户端。使用Redis事务可以将一系列命令作为单个原子操作执行,从而保证了操作的一致性。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Redis事务是一种非常强大的功能,它允许用户将一组命令作为原子操作执行,即要么全部执行,要么全部不执行。 Redis事务使用MULTI和EXEC命令组合来实现,事务中的所有命令都在相同的客户端会话中执行,并且这些命令的执行是原子性的,即要么全部执行,要么全部不执行。 ### 回答2: Redis是一种内存数据库,支持事务操作的原理是乐观锁。在Redis中,事务是一组命令的集合,可以保证这组命令的原子性执行。 Redis事务执行分为以下几个步骤: 1. 开启事务:使用MULTI命令开启一个新的事务。 2. 执行事务命令:在事务中可以添加多个命令,这些命令不会立即被执行,而是被放入一个队列中。 3. 提交事务:使用EXEC命令来提交事务。在执行EXEC命令之前,Redis会先检查事务队列中的所有命令,如果发现其中有不合法的命令,比如对不同类型的键进行操作,会立即回滚事务,否则会按顺序执行事务队列中的命令。 4. 回滚事务:如果在执行事务过程中发生错误或者回滚命令被显式调用,可以使用DISCARD命令来回滚整个事务。 在Redis事务中,所有命令都是按顺序执行的,且在执行过程中不会被其他客户端的命令中断。这是通过Redis的单线程模型来实现的,保证了事务的原子性。此外,Redis还提供了WATCH命令,可以对一个或多个关键字进行监视,如果任意一个键发生改变,则事务会自动被回滚。 需要注意的是,Redis事务并不支持回滚到特定点或保存点的功能,一旦事务被提交,其中的命令就无法回滚。因此,在使用Redis事务时,需要确保事务中的命令是符合原子性要求的,以避免可能带来的意外结果。 ### 回答3: Redis事务是指将多个命令按顺序组合成一个原子操作的过程。在事务执行期间,即使有其他客户端发送命令,也不会中断事务的执行。Redis事务原理如下: 1. 事务开始:通过MULTI命令,开始一个事务。 2. 命令入队:在MULTI和EXEC之间的命令会被放入一个队列中,但不会立即执行,而是暂时存储起来。 3. 事务执行:当执行到EXEC命令时,Redis会按照命令的顺序依次执行队列中的命令。 4. 命令执行:在事务执行过程中,Redis会顺序执行队列中的命令,并将结果保存在一个队列中。 5. 返回结果:在执行完所有命令后,会返回每个命令的执行结果。如果途中出现错误,会返回一个错误结果。 6. 事务提交:事务执行完成后,Redis会清空事务队列,并解锁相关的键值对。 Redis事务的特点有以下几点: 1. 原子性:Redis事务中的一系列命令要么全部执行成功,要么全部失败,不会出现部分命令执行成功的情况。 2. 隔离性:Redis事务执行过程中,其他客户端提交的命令不会被执行,保证了事务的隔离性。 3. 一致性:Redis事务的执行是按顺序进行的,保证了命令的一致性。 4. 可靠性:Redis事务在执行过程中,会检测到语法错误或者执行错误,立即回滚整个事务,使得结果可靠。 5. 速度:Redis事务不需要等待磁盘I/O,执行速度非常快。 需要注意的是,Redis事务不支持回滚机制。如果在事务过程中出现错误,只是返回一个错误结果,并不能回滚之前执行的命令。因此,在使用Redis事务时,需要对每个命令的执行结果进行判断,确保操作的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福大大架构师每日一题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值