一步一步学习Redis——事务的相关命令

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 一步一步学习Redis——事务的相关命令

文章目录:


1.开篇

2.Redis事务相关命令 

2.1 MULTI命令

语法

返回值

2.2 EXEC命令 

语法

返回值

实例一:执行事务时,没有出现错误 

实例二:执行事务时,出现语法错误

实例三:执行事务时,出现运行错误

实例四:执行事务时,被其他的客户端干扰

2.3 WATCH命令 

语法

返回值

2.4 UNWATCH命令 

语法

返回值

2.5 DISCARD命令

语法

返回值

1.开篇


Redis事务可以一次执行多个命令,并且带有以下三个重要的保证:

·       批量操作在发送 EXEC 命令前被放入队列缓存。

·       收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。

·       在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

·       开始事务。

·       命令入队。

·       执行事务。

一个事务的例子,它先以 MULTI 开始一个事务,然后将多个命令入队到事务中,最后由 EXEC 命令触发事务,一并执行事务中的所有命令。

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

2.Redis事务相关命令


序号

命令及描述

1

DISCARD
取消事务,放弃执行事务块内的所有命令。

2

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

3

MULTI
标记一个事务块的开始。

4

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

5

WATCH key [key...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

2.1 MULTI命令

Redis Multi 命令用于标记一个事务块的开始。

事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

语法

redis 127.0.0.1:6379> Multi

返回值

总是返回 OK


2.2 EXEC命令 

Redis Exec 命令用于执行所有事务块内的命令。

语法

redis 127.0.0.1:6379> Exec

返回值

事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil

实例一:执行事务时,没有出现错误 

实例二:执行事务时,出现语法错误

如果在我们执行事务的时候,出现了语法错误,那么整个事务都不会被执行了。 

实例三:执行事务时,出现运行错误

我们让一个字符串自增,也就是执行 INCR 命令,这样肯定会出现错误,但是事务的其他语句还是正常执行了 

实例四:执行事务时,被其他的客户端干扰

当我们执行事务的时候,还未执行 EXEC,然后有其他客户端进行干扰。 

可以看到在第一个客户端中,我们设置键 money 的值为150,之后执行 INCR 命令使得 money 自增1,紧接着再执行 EXEC 命令之前,我们打开另一个客户端,对 money 设置新的值999,此时返回第一个客户端,我们执行 EXEC 命令,可以看到 money 的值并没有受到第二个客户端的影响,仍然为自增之后的结果 151。(如果想解决这个问题,就需要用到下面的WATCH命令!!!)

2.3 WATCH命令 

Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

语法

redis 127.0.0.1:6379> WATCH key [key ...]

返回值

总是返回 OK

使用 WATCH 命令对 money 进行监控,则事务中执行相应的命令,由于我们对 money 进行了监控,所以 EXEC 命令返回了 (nil),而在另一个客户端中对 money 进行修改,就修改成功了,值为 999

2.4 UNWATCH命令 

Redis Unwatch 命令用于取消 WATCH 命令对所有 key 的监视。

语法

redis 127.0.0.1:6379> UNWATCH

返回值

总是返回 OK

2.5 DISCARD命令

Redis Discard 命令用于取消事务,放弃执行事务块内的所有命令。

语法

redis 127.0.0.1:6379> DISCARD

返回值

总是返回 OK

 

相关文章
|
2月前
|
监控 NoSQL 关系型数据库
Redis:事务(Transactions)
Redis事务支持将多个命令打包执行,但与MySQL不同,它不保证原子性、一致性、持久性和隔离性。Redis事务的核心在于“打包”命令,避免其他客户端插队,通过MULTI、EXEC、DISCARD等命令实现。此外,Redis提供WATCH和UNWATCH机制,用于监控键变化,实现类似“乐观锁”的功能,提升并发操作的安全性。
|
6月前
|
存储 缓存 监控
Redis设计与实现——Redis命令参考与高级特性
Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
333 5
|
2月前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
115 12
|
2月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
3月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
4月前
|
NoSQL Redis
Lua脚本协助Redis分布式锁实现命令的原子性
利用Lua脚本确保Redis操作的原子性是分布式锁安全性的关键所在,可以大幅减少由于网络分区、客户端故障等导致的锁无法正确释放的情况,从而在分布式系统中保证数据操作的安全性和一致性。在将这些概念应用于生产环境前,建议深入理解Redis事务与Lua脚本的工作原理以及分布式锁的可能问题和解决方案。
203 8
|
6月前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
453 17
|
6月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
916 16
|
6月前
|
消息中间件 NoSQL Unix
Redis的基本特性以及其基础命令用法
这只是冰山一角,Redis的强大功能和简洁的操作方法值得我们深入了解和掌握,是复杂数据问题解决的有力工具。所以,来一场有趣的Redis冒险吧!
191 6
下一篇
oss云网关配置