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

《Redis》事务

文章目录

  • Redis中的原子性
  • Redis的事物和MySQL事务的区别
    • Redis实现事务
    • 什么场景下,会使用事务?
  • Redis事务相关命令
    • watch命令的实现原理
  • 总结


Redis中的原子性

Redis的原子性不同于MySQL的原子性。
在这里插入图片描述

Redis的事物和MySQL事务的区别

但是注意体会Redis的事务和MySQL事务的区别:
• 弱化的原⼦性:redis没有"回滚机制".只能做到这些操作"批量执⾏".不能做到"⼀个失败就恢复到
初始状态".
• 不保证⼀致性:不涉及"约束".也没有回滚.MySQL的⼀致性体现的是运⾏事务前和运⾏后,结果都
是合理有效的,不会出现中间⾮法状态.
• 不需要隔离性:也没有隔离级别,因为不会并发执⾏事务(redis单线程处理请求).
• 不需要持久性:是保存在内存的.是否开启持久化,是redis-server⾃⼰的事情,和事务⽆关.


Redis实现事务

Redis中为了实现事务,引入了一个队列。

如果一个客户端开启了事务功能,该客户端就会维持一个队列,每次用户输入的命令,都会先进入该队列,然后等待用户输入执行事务的命令后,该队列中的命令才一次被执行,且执行完才会处理其他客户端的命令。

在这里插入图片描述

什么场景下,会使用事务?

铁路12306抢票的例子:

在这里插入图片描述
总结:redis中事务比MySQL的事务弱化了很多。
Redis事务本质上是在服务器上搞了⼀个"事务队列".每次客⼾端在事务中进⾏⼀个操作,都会把命令先
发给服务器,放到"事务队列"中(但是并不会⽴即执⾏)。⽽是会在真正收到EXEC命令之后,才真正执⾏队列中的所有操作.

因此,Redis的事务的功能相⽐于MySQL来说,是弱化很多的.只能保证事务中的这⼏个操是"连续的",不会被别的客⼾端"加塞",仅此⽽已。

Redis事务相关命令

multi:开启事务
开启事务后,接下来的所有命令都会放入事务队列中,不执行。
exec:执行事务 : 此时才真正执行队列的命令
discard:放弃当前事务,也就是把当前事务队列的命令都丢掉然后退出事务模式。
watch命令:watch监控某个key是否在一个事务执行前发生改了改变。

举个watch命令的例子:
在这里插入图片描述
但实际上,最后结果key是222。这对客户端2就不公平了,为什么我set key 333了,结果确是222?
就导致数据不一致的问题。

刚才的场景中,就可以使用watch命令来监控key,看看这个key在事务的multi和exec之间,set key之后,是否在外部被其他客户端修改了。

此时,exec后,在真正执行事务队列的命令时,发现key外部有修改,于是真正执行key 222的时候就出现了(nil),相当于只要发现我watch的key在事务外部有变化,该事务队列就被丢弃了。

watch命令的实现原理

watch的实现,类似一个”乐观锁“

先解释下乐观锁和悲观锁:
乐观锁:加锁之前有一个心里预期,预期接下来的锁冲突的概率较低。
悲观锁:加锁之前有一个心里预期,预期接下来的锁冲突的概率较高。

持有上面两种心态后,对锁冲突的操作,也有不同。
对于持有“乐观“心态的:加锁的代码可能少,成本低。
对于持有“悲观“心态的:加锁的代码可能多,成本高。

redis的watch,是基于“版本号”这种机制,实现的乐观锁。

在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

http://www.lqws.cn/news/479845.html

相关文章:

  • 抽象工厂设计模式
  • 查询消耗 IO 多的 SQL -达梦
  • 一个免费的视频、音频、文本、图片多媒体处理工具
  • 数据库高性能应用分析报告
  • 鸿蒙 Column 组件指南:垂直布局核心技术与场景化实践
  • Python爬虫实战:研究Ghost.py相关技术
  • 【深度学习与机器学习的区别】从本质到应用的全景对比
  • 单例模式-Python示例
  • 多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程
  • 探秘Flink Connector加载机制:连接外部世界的幕后引擎
  • 考研408《计算机组成原理》复习笔记,第三章(1)——存储系统概念
  • 【数据结构试题】
  • 【JS-4.4-键盘常用事件】深入理解DOM键盘事件:提升用户交互体验的关键
  • idea——AI时代学习python的必要性
  • 学习打卡---回溯
  • linux jq命令详解
  • 基于深度学习的智能图像风格迁移系统:技术与实践
  • Spring AI 项目实战(十一):Spring Boot +AI + DeepSeek 开发智能教育作业批改系统(附完整源码)
  • 华为云Flexus+DeepSeek征文|华为云 Dify 高可用部署教程:CCE 容器集群一键构建企业级智能应用
  • 【第一章-计算机系统概述】
  • 鸿蒙ArkTs仿网易云音乐项目:架构剖析与功能展示
  • 对射式红外传感器计次旋转编码器计次
  • 第八章 网络安全
  • 减少推实时视频流的延时,要提高摄像头的帧率吗
  • openCV
  • openai-agents实现input_guardrails
  • 策略设计模式
  • 使用 RedisVL 进行复杂查询
  • Vue 组件定义方式的区别
  • Rabbitmq集成springboot 使用死信队列