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失败了,但是其他两个命令还是执行了。
相关推荐
本次我们关注的是其Linux版本的最新发行版——redis-7.2.3.zip。这个压缩包包含了在Linux环境下运行Redis 7.2.3所需的所有文件。 Redis 7.2.3的更新可能包含性能优化、新功能的引入、bug修复以及对旧特性的改进。...
3. **事务**: 虽然Redis的事务不如传统数据库那样强大,但仍然可以保证在一个操作序列中的所有命令要么全部成功,要么全部失败。 4. **持久化**: Redis通过两种方式实现数据持久化:RDB(快照)和AOF(Append Only ...
在事务执行过程中,如果遇到命令执行错误,例如执行了一个数值操作命令但提供的数据类型不是数值类型,那么命令会执行失败,但Redis事务会继续执行后面的命令,并不会回滚整个事务,也就是说,Redis的事务操作并没有...
4. **事务支持**:Another Redis Desktop Manager支持Redis的事务功能,允许用户在一个操作序列中执行多个命令,确保原子性。 5. **脚本编辑器**:用户可以编写和运行Lua脚本,利用EVAL命令在Redis服务器上执行,这...
标题中的"redis-mac-5.0.5.tar.gz"表示的是Redis的一个特定版本——5.0.5,适用于Mac操作系统的客户端安装包,采用常见的gzip压缩格式。 Redis 5.0.5是该数据库系统的一个稳定版本,包含了多项优化和改进。这个版本...
3.2.100是Redis的一个稳定版本,包含了许多重要的特性,如发布/订阅系统、事务支持、持久化机制(AOF和RDB)以及Lua脚本支持。安装并运行Redis在Windows上,可以为开发和测试提供便利。 最后,“redis-4.0.0.tar.gz...
6. **流(Streams)**: 在5.0.6版本中,Redis引入了新的数据结构Stream,提供了一种时间序列数据存储方式,适用于日志管理和实时分析。 7. **模块系统**: Redis 5.0.6支持模块扩展,允许开发者为Redis添加自定义功能...
- **流(Streams)**:Redis 4.0 引入了新的数据结构——流,它是一种复杂的数据结构,可以用来实现日志、时间序列数据存储等功能,支持多消费者组和持久化。 - **模块(Module System)**:4.0版本加强了模块系统,...
6. **事务支持**:尽管Redis本身不支持ACID事务,但Spring Data Redis提供了一种模拟事务的方式,允许你在多个操作之间保持一致性。 7. **Lettuce客户端**:除了Jedis,Spring Data Redis也支持另一个Redis客户端...
在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨如何利用这三者进行列表数据类型的存储和操作。 首先,Redis 的列表类型允许我们在一个键下存储多个有序的字符串元素。这种数据...
根据给定文件的信息,我们可以提炼出一系列关于Redis的重要知识点,这些知识点主要涵盖了Redis的基本概念、数据类型、优势对比、持久化机制、性能问题及其解决办法、过期键处理策略、淘汰策略、内存管理机制、同步...
### Java核心面试知识集——Redis面试题解析 #### 一、Redis数据结构相关 ##### 1. Redis支持的数据类型 Redis 提供了多种内置的数据结构,适用于不同的应用场景,包括但不限于以下几种: - **String(字符串)*...
在本篇博客“征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)”中,我们将深入探讨如何利用Redis、Jedis库以及Spring框架进行哈希表的操作,特别是`HMGET`和`HMSET`这两个重要的命令。...
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和数据持久化...结合这三个强大的工具——Redis、Spring和Maven,开发者可以构建出高效、易于维护的Java应用,并充分利用Redis的高性能数据存储和缓存能力。
Redis是一款高性能的键值对数据存储系统,常用于缓存、消息队列和数据库等领域。其免安装版本方便用户快速启动和使用,尤其适合新手学习和测试环境。在这个压缩包中,你将找到Redis的基本组件,无需繁琐的配置和编译...
Redis 是一款高性能的键值存储系统,常被用作分布式缓存。在使用 RedisTemplate 进行操作时,有时可能会遇到无法获取数据的问题,这通常涉及到多个方面。以下是对这些可能出现问题的详细分析: 1. **服务数据源配置...
5. 事务:Redis支持简单的事务操作,用户可以一次性执行多个命令,并保证这些命令的原子性。 6. Lua脚本:Redis允许使用Lua语言编写脚本并在服务器端执行,这使得在客户端和服务器之间进行复杂计算成为可能,同时...
3. **持久化机制**:Redis提供了两种主要的持久化方式——RDB(快照)和AOF(Append Only File)。RDB定期保存数据库的全量状态,恢复速度快但可能会丢失部分数据;AOF记录每次写操作,恢复时重放日志,数据完整但...
Linqer 那点所谓的分布式(2)那点所谓的分布式——memcache 那点所谓的分布式——redis 树结构专题(5)6天通吃树结构—— 第五天 Trie树 6天通吃树结构—— 第四天 伸展树 6天通吃树结构—— 第三天 Treap树 6天通吃树...
基于Mysql,Redis乐观锁进行事务版本控制以及基于石英进行事务恢复。 支持各种事务日志序列化以及事务存储实现。 调用方式(版本):Dubbo,HTTP 业务场景 我们有必要使用TCC分布式事务机制来保证各个服务形成一个...