Redis事务失效的三种场景

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis事务失效的三种场景

Redis事务失效的三种场景


文章目录

Redis 事务失效的三种场景

Redis事务失败,有三种类型的失败场景:

命令入队报错

在事务提交之前,客户端执行的命令缓存(队列)失败,比如命令的语法错误(命令参数个数错误,不支持的命令等等)。

如果发生这种类型的错误,Redis将向客户端返回包含错误提示信息的响应,同时Redis会清空队列中的命令并取消事务。

示例代码如下,开启一个客户端:

127.0.0.1:6379> set name mengmeng   # 事务之前执行
OK
127.0.0.1:6379> multi         # 开启事务
OK
127.0.0.1:6379> set name qianqian   # 事务中执行,命令入队列
QUEUED
127.0.0.1:6379> setset name qianqian2   # 错误的命令,模拟失败场景
(error) ERR unknown command `setset`, with args beginning with: `name`, `qianqian2`,
127.0.0.1:6379> exec        # 提交事务,发现由于上条命令的错误导致事务已经自动取消了
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> get name      # 查询name,发现未被修改
"mengmeng"

最后发现事务里语句失效

命令执行报错

事务提交后开始顺序执行命令,之前缓存在队列中的命令有可能执行失败。

示例代码如下,开启一个客户端:

127.0.0.1:6379> multi       # 开启事务
OK
127.0.0.1:6379> set name mengmeng   # 设置名字
QUEUED
127.0.0.1:6379> set age 18      # 设置年龄
QUEUED
127.0.0.1:6379> lpush age 20    # 此处仅检查是否有语法错误,不会真正执行
QUEUED
127.0.0.1:6379> exec        # 提交事务后开始顺序执行命令,第三条命令执行失败
1) OK
2) OK
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get name      # 第三条命令失败没有将前两条命令回滚
"mengmeng"

最后发现事务里语句失效

乐观锁导致失效

由于乐观锁失败,事务提交时将丢弃之前缓存的所有命令序列。

watch 监控 key 所起的作用实际上是一个乐观锁,它所监控的是在事务期间有没有其他客户端对所监控的值进行修改

在Redis中可以通过开启两个redis客户端并结合watch命令模拟这种失败场景。

示例代码如下,开启两个客户端:

# 客户端1
127.0.0.1:6379> set name mengmeng   # 客户端1设置name
OK
127.0.0.1:6379> watch name      # 客户端1通过watch命令给name加乐观锁
OK
# 客户端2
127.0.0.1:6379> get name      # 客户端2查询name
"mengmeng"
127.0.0.1:6379> set name qianqian   # 客户端2修改name值
OK
# 客户端1
127.0.0.1:6379> multi         # 客户端1开启事务
OK
127.0.0.1:6379> set name lili     # 客户端1修改name
QUEUED
127.0.0.1:6379> exec        # 客户端1提交事务,返回空
(nil)
127.0.0.1:6379> get name      # 客户端1查询name,发现name没有被修改为lili
"qianqian"


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
缓存 NoSQL Redis
Redis 事务
10月更文挑战第18天
25 1
|
1月前
|
监控 NoSQL Java
场景题:百万数据插入Redis有哪些实现方案?
场景题:百万数据插入Redis有哪些实现方案?
42 1
场景题:百万数据插入Redis有哪些实现方案?
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
77 6
|
3月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
64 4
|
1月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
25 2
|
1月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
109 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
248 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
6月前
|
存储 消息中间件 缓存
Redis的高性能使得它非常适合用于实时分析场景
【5月更文挑战第15天】Redis在Python Web开发中扮演关键角色,常用于缓存系统,提高数据读取速度;会话管理,存储用户信息;分布式锁,确保数据一致性;排行榜和计数,利用有序集合和哈希结构;消息队列,基于列表结构实现异步处理;实时分析,高效处理实时数据。其丰富的数据结构和高性能使其在多种场景下应用广泛。
342 3
|
3月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
下一篇
无影云桌面