当前位置: 首页 > news >正文

【Redis】redis事物与管道

Redis 事务(Transaction)

事务概念

  • 事务:是一组操作的集合,是不可分割的工作单元。
  • Redis 事务特点:
    • 一个事务可以一次执行多个命令。
    • 所有命令都被顺序化,形成一个队列。
    • 所有命令在执行 EXEC 时一次性、顺序执行。

与 MySQL 事务的区别

特点RedisMySQL
提交前执行情况命令只入队,执行 EXEC 前不实际执行执行前可能已部分生效
原子性保障不保证所有指令成功或失败(无回滚)支持回滚
执行过程命令顺序执行,期间不被其它命令插入依赖事务隔离级别

Redis 保证事务内命令顺序执行:
1 -> 2 -> 3,不会变成 1 -> 2 -> 被插队 -> 3


事务使用示例

1. 正常事务执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 1
QUEUED
127.0.0.1:6379(TX)> set k2 2
QUEUED
127.0.0.1:6379(TX)> set k3 3
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
3) OK

2. 放弃事务

127.0.0.1:6379> MULTI
127.0.0.1:6379(TX)> set k1 11
127.0.0.1:6379(TX)> set k2 22
127.0.0.1:6379(TX)> DISCARD
OK

事务出错

1. 语法错误

在命令入队阶段就报错,事务无法执行:

127.0.0.1:6379> MULTI
127.0.0.1:6379(TX)> set k2
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> EXEC
(error) EXECABORT Transaction discarded because of previous errors.

2. 逻辑错误

命令入队成功,但某条命令在执行时失败,不影响其他命令:

127.0.0.1:6379> set name luobozi
127.0.0.1:6379> MULTI
127.0.0.1:6379(TX)> INCR name   # name 是字符串,不能自增
127.0.0.1:6379(TX)> set k1 12
127.0.0.1:6379(TX)> EXEC
1) (error) ERR value is not an integer
2) OK

Redis 锁机制:乐观锁

Watch 命令

  • 使用 WATCH 对某个 key 进行监控。
  • 如果事务执行前该 key 被修改,EXEC 执行失败,事务不会生效。

下面演示了Watch 对num施加了乐观锁,最后EXEC提交前修改了num导致事务失败
在这里插入图片描述

乐观锁 vs 悲观锁

类型描述
乐观锁假设不会发生冲突,提交前检查(如 Redis WATCH
悲观锁假设总会冲突,使用互斥锁机制控制访问

Redis 管道(Pipeline)

原因

  • TCP 通信频繁读写会造成性能瓶颈。
  • 多次发送命令、等待响应效率低。

管道原理

  • 一次性发送多条命令 到 Redis。
  • Redis 执行完后 一次性返回结果
  • 不具有事务的隔离和原子性。

使用示例

# test.txt 文件内容:
get k1
set k2 v2
set k3 v3

# 使用管道批量执行
cat test.txt | redis-cli -a 123456 --pipe

注意:

  • 管道命令执行失败,不会影响后续命令执行。
  • 命令过多会导致客户端阻塞过久。

事务 VS 管道

特性事务(Transaction)管道(Pipeline)
原子性有部分原子性,顺序执行,不可插队无原子性
并发控制会阻塞其它命令插入(顺序执行)不阻塞其他命令
发送方式多条命令逐条发送,最后 EXEC 执行多条命令一次性发送
执行方式统一入队后执行服务端逐条执行后统一返回
错误处理语法错误直接终止事务失败命令不影响后续命令

相关文章:

  • (四)深入理解AVFoundation-播放:高度自定义视频播放器 UI
  • react从零开始的基础课1
  • LeetCode:链表
  • 如何使用DeepSeek制作数学动态可视化课件?
  • MyBatis 中 Mapper 传递参数的多种方法
  • STM32自学进阶指南:从入门到精通的成长路径 | 零基础入门STM32第九十九步
  • 2. Scala 高阶语法之集合与元组
  • 【HarmonyOS 5】鸿蒙实现手写板
  • Linux找不到virtualenvwrapper.sh(已解决)
  • 提示词工程学习笔记
  • FreertosHAL库笔记
  • 什么是供应链金融
  • 监控docker中的java应用
  • python工程中的包管理(requirements.txt)
  • 数字政府与智慧城市区别报告分析
  • Spring AI 1.0.0 M7里程碑:拆分模块、更好用、更灵活
  • 免费下载地图切片数据以及通过CesiumEarth在Windows和安卓本地浏览
  • SpringBoot中3种条件装配技术
  • 心率测量-arduino+matlab
  • 语音精准转化文字极速 安卓版
  • 哈莉·贝瑞、洪常秀等出任戛纳主竞赛单元评委
  • 宁夏民政厅原厅长欧阳艳已任自治区政府副秘书长、办公厅主任
  • 人到中年为何腰围变粗?科学家发现腹部脂肪增加的细胞元凶
  • 油电同智,安全超充!从上海车展看中国汽车产业先发优势
  • 影子调查|23岁男子驾照拟注销背后的“被精神病”疑云
  • 学校食堂饭菜有蛆?举报人遭值班人员辱骂?四川苍溪县教育局回应