`

Redis 序列之一——Redis的事务

阅读更多

           redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。

          (一)redis事务的执行

           一般情况下redis在接受到一个client发来的命令后会立即处理并返回处理结果,但是当一个client在一个连接中发出 multi 命令后,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client,然后此连接就结束事务上下文。例如:


                                        

            发出multi命令后, 再发出incr a和incr b命令并没执行而是被放到了队列中。调用exec后俩个命令被连续的执行,最后返回的是两条命令执行后的结果。

 

            (二)redis事务的取消

             我们可以调用 discard 命令来取消一个事务。
                                         
               可以发现这次incr a incr b都没被执行。 discard命令其实就是清空事务的命令队列并退出事务上下文。  虽说redis事务在本质上也相当于序列化隔离级别的了, 但是由于事务上下文的命令只排队并不立即执行,所以事务中的写操作不能依赖事务中的读操作结果。

 

             (三)实现CAS

             Redis使用乐观锁来实现了CAS(check and set)操作,在redis 2.1后添加了watch命令,可以用来实现Redis事务中的CAS操作。

             watch 监视指定的key,这个key可以有多个。当被watched的key在事务exec前至少有一个发生改变,那么整个事务将跳出,exec命令返回(nil)。

                    

              左图说明:执行watch命令后,在进入事务之前(执行multi命令之前),如果被watch的key(a)没有发生改变,那么事务是有效的,在事务里修改key是会生效的。

              右图说明:执行watch命令后,在进入事务之前(执行multi命令之前),如果被watch的key(a)发生了改变,那么事务就会失效,即事务里对被watch的key进行操作是无效的(其value值不会发生变化)。

 

              (四)redis事务的缺陷

              redis的事务实现是如此简单,当然会存在一些问题。redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令

                  

                  可以看到虽然incr b失败了,但是其他两个命令还是执行了。

 

分享到:
评论

相关推荐

    redis-7.2.3.zip

    本次我们关注的是其Linux版本的最新发行版——redis-7.2.3.zip。这个压缩包包含了在Linux环境下运行Redis 7.2.3所需的所有文件。 Redis 7.2.3的更新可能包含性能优化、新功能的引入、bug修复以及对旧特性的改进。...

    redis-server:5.0.14.1 windows版本

    3. **事务**: 虽然Redis的事务不如传统数据库那样强大,但仍然可以保证在一个操作序列中的所有命令要么全部成功,要么全部失败。 4. **持久化**: Redis通过两种方式实现数据持久化:RDB(快照)和AOF(Append Only ...

    15原理 5:同舟共济 —— 事务(1).md

    在事务执行过程中,如果遇到命令执行错误,例如执行了一个数值操作命令但提供的数据类型不是数值类型,那么命令会执行失败,但Redis事务会继续执行后面的命令,并不会回滚整个事务,也就是说,Redis的事务操作并没有...

    轻量级的Redis桌面客户端.rar

    4. **事务支持**:Another Redis Desktop Manager支持Redis的事务功能,允许用户在一个操作序列中执行多个命令,确保原子性。 5. **脚本编辑器**:用户可以编写和运行Lua脚本,利用EVAL命令在Redis服务器上执行,这...

    redis-mac-5.0.5.tar.gz

    标题中的"redis-mac-5.0.5.tar.gz"表示的是Redis的一个特定版本——5.0.5,适用于Mac操作系统的客户端安装包,采用常见的gzip压缩格式。 Redis 5.0.5是该数据库系统的一个稳定版本,包含了多项优化和改进。这个版本...

    redis可视化客户端Another-Redis-Desktop-Manager.1.5.5和redis win、linux版本

    3.2.100是Redis的一个稳定版本,包含了许多重要的特性,如发布/订阅系统、事务支持、持久化机制(AOF和RDB)以及Lua脚本支持。安装并运行Redis在Windows上,可以为开发和测试提供便利。 最后,“redis-4.0.0.tar.gz...

    redis-5.0.6.tar.gz

    6. **流(Streams)**: 在5.0.6版本中,Redis引入了新的数据结构Stream,提供了一种时间序列数据存储方式,适用于日志管理和实时分析。 7. **模块系统**: Redis 5.0.6支持模块扩展,允许开发者为Redis添加自定义功能...

    redis-Stable (4.0)

    - **流(Streams)**:Redis 4.0 引入了新的数据结构——流,它是一种复杂的数据结构,可以用来实现日志、时间序列数据存储等功能,支持多消费者组和持久化。 - **模块(Module System)**:4.0版本加强了模块系统,...

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar包

    6. **事务支持**:尽管Redis本身不支持ACID事务,但Spring Data Redis提供了一种模拟事务的方式,允许你在多个操作之间保持一致性。 7. **Lettuce客户端**:除了Jedis,Spring Data Redis也支持另一个Redis客户端...

    征服 Redis + Jedis + Spring (三)—— 列表操作

    在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨如何利用这三者进行列表数据类型的存储和操作。 首先,Redis 的列表类型允许我们在一个键下存储多个有序的字符串元素。这种数据...

    (2024)Redis,快看看这40道面试题.pdf

    根据给定文件的信息,我们可以提炼出一系列关于Redis的重要知识点,这些知识点主要涵盖了Redis的基本概念、数据类型、优势对比、持久化机制、性能问题及其解决办法、过期键处理策略、淘汰策略、内存管理机制、同步...

    Java核心面试知识集-Redis面试题

    ### Java核心面试知识集——Redis面试题解析 #### 一、Redis数据结构相关 ##### 1. Redis支持的数据类型 Redis 提供了多种内置的数据结构,适用于不同的应用场景,包括但不限于以下几种: - **String(字符串)*...

    征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)

    在本篇博客“征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)”中,我们将深入探讨如何利用Redis、Jedis库以及Spring框架进行哈希表的操作,特别是`HMGET`和`HMSET`这两个重要的命令。...

    redis+spring+maven

    Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和数据持久化...结合这三个强大的工具——Redis、Spring和Maven,开发者可以构建出高效、易于维护的Java应用,并充分利用Redis的高性能数据存储和缓存能力。

    Redis免安装版本,嘎嘎好使!推荐新手使用,下载

    Redis是一款高性能的键值对数据存储系统,常用于缓存、消息队列和数据库等领域。其免安装版本方便用户快速启动和使用,尤其适合新手学习和测试环境。在这个压缩包中,你将找到Redis的基本组件,无需繁琐的配置和编译...

    分布式缓存RedisTemplate取不到数据的问题(csdn)————程序.pdf

    Redis 是一款高性能的键值存储系统,常被用作分布式缓存。在使用 RedisTemplate 进行操作时,有时可能会遇到无法获取数据的问题,这通常涉及到多个方面。以下是对这些可能出现问题的详细分析: 1. **服务数据源配置...

    限时免费!Redis资料包免费领,再不下载就晚了.zip

    5. 事务:Redis支持简单的事务操作,用户可以一次性执行多个命令,并保证这些命令的原子性。 6. Lua脚本:Redis允许使用Lua语言编写脚本并在服务器端执行,这使得在客户端和服务器之间进行复杂计算成为可能,同时...

    Redis-x64-3.2.100 2.zip

    3. **持久化机制**:Redis提供了两种主要的持久化方式——RDB(快照)和AOF(Append Only File)。RDB定期保存数据库的全量状态,恢复速度快但可能会丢失部分数据;AOF记录每次写操作,恢复时重放日志,数据完整但...

    数据结构算法

    Linqer 那点所谓的分布式(2)那点所谓的分布式——memcache 那点所谓的分布式——redis 树结构专题(5)6天通吃树结构—— 第五天 Trie树 6天通吃树结构—— 第四天 伸展树 6天通吃树结构—— 第三天 Treap树 6天通吃树...

    tyloo:分布式交易框架——TCC

    基于Mysql,Redis乐观锁进行事务版本控制以及基于石英进行事务恢复。 支持各种事务日志序列化以及事务存储实现。 调用方式(版本):Dubbo,HTTP 业务场景 我们有必要使用TCC分布式事务机制来保证各个服务形成一个...

Global site tag (gtag.js) - Google Analytics