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的事务功能,可以执行多个命令并确保它们在同一个事务中执行,避免了因单个命令执行失败而导致的数据不一致问题。

一个客户端

另外一个客户端

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

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

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

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

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

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

1、语法命令错误

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

2、运行时错误

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

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

Redis的事务原理

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

2023-06-09:什么是Redis事务?原理是什么?的更多相关文章

  1. Redis事务原理分析

    Redis事务原理分析 基本应用 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD ...

  2. 一、Redis事务原理分析

    一.Redis事务原理分析 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD.通过 ...

  3. Redis核心原理与实践--事务实践与源码分析

    Redis支持事务机制,但Redis的事务机制与传统关系型数据库的事务机制并不相同. Redis事务的本质是一组命令的集合(命令队列).事务可以一次执行多个命令,并提供以下保证: (1)事务中的所有命 ...

  4. redis 笔记06 发布与订阅、事务、慢查询日志、监视器

    发布与订阅 1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责 解除客 ...

  5. Redis事务实现原理

    一:简介 Redis事务通常会使用MULTI,EXEC,WATCH等命令来完成,redis实现事务实现的机制与常见的关系型数据库有很大的却别,比如redis的事务不支持回滚,事务执行时会阻塞其它客户端 ...

  6. Redis学习笔记(4) Redis事务、生存时间及排序

    1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次 ...

  7. Redis事务和分布式锁

    Redis事务 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MUL ...

  8. Redis核心原理

    Redis系统介绍: Redis的基础介绍与安装使用步骤:https://www.jianshu.com/p/2a23257af57b Redis的基础数据结构与使用:https://www.jian ...

  9. Redis事务介绍

    概述 相信学过Mysql等其他数据库的同学对事务这个词都不陌生,事务表示的是一组动作,这组动作要么全部执行,要么全部不执行.为什么会有这样的需求呢?看看下面的场景: 微博是一个弱关系型社交网络,用户之 ...

  10. Redis事务和watch

    redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...

随机推荐

  1. Little Snitch 5 - Mac 老牌防火墙安全工具软件小飞贼,监控和组织特定软件的网络连接

    一旦连接到Internet,应用程序就可以随时随地发送它们想要的任何东西.通常情况下,他们是为你做的.但有时,例如在跟踪软件.木马或其他恶意软件的情况下,它们不会.但你不会注意到任何东西,因为所有这些 ...

  2. 位运算符n&(n-1)详解与妙用

    用处一:求一个int类型数是否为2的幂 1.当n=4时,二进制为:0100 n-1=3,二进制为:0011 则:n&(n-1)==0  解释(将0100最右边的1变为0 则 0000=0) 2 ...

  3. Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信)

    Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信) 前几天在 futureoflife 网站上有一封公开信,呼吁暂停大型人工智能 ...

  4. 长达 1.7 万字的 explain 关键字指南!

    当你的数据里只有几千几万,那么 SQL 优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL 优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让 MySQL 查询语句又快又好是一件 ...

  5. 升级二进制kubernetes集群

    升级二进制kubernetes集群 背景介绍 最近由于时间不足,暂时无法对小版本更新第一时间出新的文档.若需要升级集群版本,可以参考此文档进行操作,每个节点一个一个地更新.大版本更新请各位持续关注我的 ...

  6. Looper 源码分析

    //可以看到我们的Looper是存放在线程独有的ThreadLocal进行隔离的    //也就是每个线程独有一份Looper    static final ThreadLocal<Loope ...

  7. SQL优化(一)

    1.什么是SQL优化 SQL语句的优化是将性能低下的SQL语句转换成目的相同但是性能优异的SQL语句. 2.为什么需要学习SQL优化 SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定 ...

  8. Python精品书籍

    目录 Python精品书籍 * 参考资料 基础 Python编程:从入门到实践(第2版) 笨办法学_Python Coding for Kids: Python: Learn to Code with ...

  9. 真实场景sql优化持续更新(老司机必备)

    概述 下述场景,均来自实际产品线上经验,出于保密考量,所有需求场景都是仿造的,模拟遇到过的真实场景. 场景一: 统计数据(Order by 不具备唯一性导致的分页数据混乱) 需求 在实际业务场景中,我 ...

  10. Linux安装Net7SDK运行Net项目

    Linux安装Net7SDK运行Net项目 安装Net7 SDK 1.安装sdk依赖环境 wget https://packages.microsoft.com/config/ubuntu/20.04 ...