尚硅谷redis7 47-48 redis事务之理论简介

47 redis事务之理论简介

什么是事务

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入

能干什么?

一个队列中,一次性、顺序性、排他性的执行一系列操作

redis事务vs数据库事务

1 单独的隔离操作

        Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的

2 没有隔离级别的概念

        因为事务提交前任何指令都不会被实际执行【只是放在队列里面不会执行】,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了

3不保证原子性

        Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力

4 排它性

        Redis会保证一个事务内的命令依次执行,而不会被其它命令插入

48 redis事务之案例实操

Redis 事务是通过 MULTI 命令进入的。该命令始终返回 OK。此时,用户可以发送多个命令,但 Redis 不会立即执行这些命令,而是将它们排入队列中。所有命令会在调用 EXEC 命令后一次性执行。

如果调用 DISCARD 命令,则会清空事务队列并退出事务

redis事务命令

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

2.EXEC        执行所有事务块内的参令。

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

4.UNWATCH        取消WATCH 命令对所有key的监视,

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

CASE1:正常执行

MULTI 和 EXEC

CASE2:放弃事务

MULTI 和 DISCARD

CASE3:全体连坐

一条命令出错,就全部放弃执行

127.0. 0.1:6379> MULTI
OK
127. 0. 0. 1: 6379(TX)> set k1 v111
QUEUED
127.0. 0. 1: 6379( TX)> set k2 v222
QUEUED
127.0.0.1:6379(TX)> set k3   // 这个命令本身就是错误的
(error) ERR wrong number of arguments for 'set' command
127. 0. 0. 1: 6379( TX) >
127. 0. 0. 1: 6379( TX) > EXEC
EXECABORT Transaction discarded because of previous errors.  //事务队列中的所有命令都不执行

事务中的错误

在事务过程中,可能会遇到两类命令错误:

  1. 命令在排队阶段失败:也就是说,在调用 EXEC 之前就发生了错误。例如,命令可能存在语法错误(参数数量错误、命令名称错误等),或者遇到某些关键问题,如内存不足(例如服务器配置了 maxmemory 指令设置了内存上限)。

    1. 这种情况只能全部命令都放弃执行

  2. 命令在 EXEC 后执行时失败:例如,对某个键执行了不适用的操作(比如对一个字符串类型的键执行列表操作)。

CASE4:冤头债主

在执行 EXEC 之后发生的错误不会被特殊处理:即使事务中的某个命令执行失败,其他命令仍然会被继续执行。

总结:对的放行,错的不执行

补充:redis不提供事务回滚的功能,开发者必须在事务执行出错后,自行恢复数据库状态。

INCR email命令错误:邮箱是字符串不可能自增

CASE5:watch监控

redis的watch类似于乐观锁的设定,类似于CAS

悲观锁是一种假设“总会发生冲突”的锁机制。假设每次访问数据都是对数据进行修改。因此在对数据进行操作前,会先加锁,防止其他线程同时访问,以确保数据安全。

乐观锁假设“并发冲突是少数”,所以不加锁。 假设每次访问数据都不会修改数据。因此在更新数据时才校验数据是否被其他线程修改。

CAS 是一种无锁的原子操作,全称是 比较并交换。它是乐观锁的具体实现方式之一,底层依赖于 CPU 的原子指令。

工作原理:

  • 先读取变量的旧值

  • 和预期值进行比较

  • 如果相等,则更新为新值

  • 如果不等,说明有其他线程修改过,则重试或失败

watch

初始化k1和balance两个key,先监控再开启multi,保证两key变动在同一个事务内

127. 0. 0. 1:6379> set k1 abc
OK
127. 0. 0. 1: 6379> set balance 100
OK
127. 0. 0. 1:6379>
127. 0. 0. 1: 6379> WATCH balance
OK
127.0. 0.1:6379>
127. 0. 0. 1: 6379> MULTI
OK
127. 0. 0. 1: 6379( TX) > set k1 abc2
QUEUED
127. 0. 0. 1: 6379( TX) > set balance 110
QUEUED
127. 0. 0. 1: 6379( TX) > EXEC
1) OK
2) OK
127.0. 0. 1:6379> get k1
"abc2"

有加塞篡改:

        客户端1监控了balance

        客户端2修改了balance

        客户端1的事务执行失败返回空

unwatch

UNWATCH 用于 取消之前通过 WATCH 命令监视的所有键,避免这些键的变动影响事务的执行。

  • 在你使用 WATCH 命令监控某些键的变化时,如果你不再想基于这些键判断是否执行事务,就可以用 UNWATCH 来取消。

  • 如果你调用了 DISCARD,Redis 会自动 UNWATCH,无需手动取消。

WATCH mykey
GET mykey
UNWATCH       # 取消监视
MULTI
SET mykey "newvalue"
EXEC

小结

一旦执行了exec之前加的监控锁都会被去掉。

当客户端连接丢失【比如退出连接】,所有东西都会被取消监视

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 在四大核心场景中的应用实践与优化

一、Nginx 核心应用场景深度解析 1. HTTP 服务器:静态资源的高性能承载者 Nginx 作为 HTTP 服务器时,凭借轻量级架构和高效的事件驱动模型,成为静态资源服务的首选方案。 核心能力与场景 静态文件高效处理:直接响应 HTML、CSS…

亚当·斯密思想精髓的数学建模与形式化表征

亚当斯密思想精髓的数学建模与形式化表征 摘要:本文运用数学建模方法对亚当斯密的经济与伦理思想进行形式化表征。通过分工的规模经济模型和市场均衡条件展现《国富论》中"看不见的手"原理;采用扩展效用函数与合作博弈均衡解释《道德情操论》…

FastDFS集群部署与性能优化实战

目录 一、介绍 二、FastDFS原理 三、FastDFS部署 1.资源清单 2.修改主机名 3.安装libfastcommon(tracker01、tracker02、storage1、storage2) 4.安装编译FastDFS(tracker01、tracker02、storage1、storage2) 5.配置tracker…

学习心得(14--16)

模板: 前端的页面单独存在模板当中 jinja2 :模板语法 保持前端页面不变的情况下,返回内容给前端做法: 写一个data,并在return中的render_template中,写上datadata 使用时,要将templa…

stm与51单片机哪个更适合新手学

一句话总结 51单片机:像学骑自行车,简单便宜,但只能在小路上骑。 STM32:像学开汽车,复杂但功能强,能上高速公路,还能拉货载人(做复杂项目)。 1. 为啥有人说“先学51单片…

Web安全测试-文件上传绕过-DVWA

Web安全测试-文件上传绕过-DVWA 很多网站都有上传资源(图片或者文件)的功能,资源上传后一般会存储在服务器的一个文件夹里面,如果攻击者绕过了上传时候的文件类型验证,传了木马或者其他可执行的代码上去,那服务器就危险了。 我用…

ant-design-vue中的分页组件自定义

ant-design-vue中的分页组件自定义 实现效果 实现代码 需要自己创建一个分页组件的代码然后导入进去。 <template><div style"display: flex; justify-content: space-between; margin-bottom: 10px"><div><a-select v-model:value"pageS…

LabVIEW软件开发过程中如何保证软件的质量?

一、需求与架构设计阶段 明确功能边界与技术指标 在测试系统设计初期&#xff0c;围绕比例阀性能测试核心需求&#xff08;如压力 / 流量信号采集、特性曲线绘制、数据对比分析&#xff09;&#xff0c;定义软件功能模块&#xff08;数据采集、逻辑控制、界面显示&#xff09;&…

Linux 527 重定向 2>1 rsync定时同步(未完)

rsync定时同步 配环境 关闭防火墙、selinux systemctl stop firewalld systemctl disable firewalld setenforce0 vim /etc/SELINUX/config SELINUXdisable515 设置主机名 systemctl set-hostname code systemctl set-hostname backup 配静态ip rsync 需要稳定的路由表和端…

Vue 3.0 中状态管理Vuex 与 Pinia 的区别

在 Vue.js 应用开发中&#xff0c;状态管理是构建复杂应用的关键环节。随着 Vue 3 的普及和 Composition API 的引入&#xff0c;开发者面临着状态管理库的选择问题&#xff1a;是继续使用经典的 Vuex&#xff0c;还是转向新兴的 Pinia&#xff1f;本文将从设计理念、API 设计、…

分布式缓存:三万字详解Redis

文章目录 缓存全景图PreRedis 整体认知框架一、Redis 简介二、核心特性三、性能模型四、持久化详解五、复制与高可用六、集群与分片方案 Redis 核心数据类型概述1. String2. List3. Set4. Sorted Set&#xff08;有序集合&#xff09;5. Hash6. Bitmap7. Geo8. HyperLogLog Red…

React useEffect和useEffectLa

原理把对象以树的形式存档&#xff0c;根据URL进行匹配渲染对应组件 useEffect 和useLayoutEffect区别 useEffect中的回调函数放在异步任务队列中&#xff0c;是异步的&#xff0c;会在React渲染&#xff0c; dom 元素更新&#xff0c;浏览器绘制完成之后才会执行 useLayout…

multiprocessing多进程使用案例

multiprocessing — 基于进程的并行&#xff1a;https://docs.python.org/zh-cn/3.11/library/multiprocessing.html import sys from fastchat.serve.controller import Controller from fastchat.serve.model_worker import ModelWorker from fastchat.serve.openai_api_ser…

鸿蒙OSUniApp 开发实时天气查询应用 —— 鸿蒙生态下的跨端实践#三方框架 #Uniapp

使用 UniApp 开发实时天气查询应用 —— 鸿蒙生态下的跨端实践 在移动互联网时代&#xff0c;天气应用几乎是每个人手机中的"标配"。无论是出行、旅游还是日常生活&#xff0c;实时获取天气信息都极为重要。本文将以"实时天气查询应用"为例&#xff0c;详…

蓝桥杯178 全球变暖

题目描述 你有一张某海域 NxN 像素的照片&#xff0c;"."表示海洋、"#"表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上…

第五十二节:增强现实基础-简单 AR 应用实现

引言 增强现实(Augmented Reality, AR)是一种将虚拟信息叠加到真实世界的技术,广泛应用于游戏、教育、工业维护等领域。与传统虚拟现实(VR)不同,AR强调虚实结合,用户无需完全沉浸到虚拟环境中。本文将通过Python和OpenCV库,从零开始实现一个基础的AR应用:在检测到特定…

青少年编程与数学 02-019 Rust 编程基础 23课题、web服务器

青少年编程与数学 02-019 Rust 编程基础 23课题、web服务器 一、单线程Web 服务器基本实现步骤完整代码示例运行结果项目结构注意事项扩展方向 二、多线程Web服务器1. 基本架构设计2. 完整实现代码项目文件结构文件内容Cargo.tomlsrc/main.rssrc/lib.rsstatic/hello.htmlstatic…

(14)JVM弹性内存管理

文章目录 &#x1f680; JVM弹性内存管理&#xff1a;K8s环境下的内存优化终极攻略⚡ TL;DR&#x1f635; 等等&#xff0c;为什么我需要关心这个&#xff1f;&#x1f6e0;️ 五步搞定弹性内存&#xff08;拯救你的Java应用&#xff09;1️⃣ JVM参数调教2️⃣ 监控指标全覆盖…

Spring Boot集成Spring AI与Milvus实现智能问答系统

在Spring Boot中集成Spring AI与Milvus实现智能问答系统 引言 随着人工智能技术的快速发展&#xff0c;智能问答系统在企业中的应用越来越广泛。然而&#xff0c;传统的问答系统往往面临AI幻觉&#xff08;Hallucination&#xff09;问题&#xff0c;即生成不准确或无意义的回…

电脑网络如何改ip地址?ip地址改不了怎么回事

在日常使用电脑上网时&#xff0c;我们有时会遇到需要更改IP地址的情况&#xff0c;比如访问某些受限制的网站、解决网络冲突问题&#xff0c;或者出于隐私保护的需求。然而&#xff0c;许多用户在尝试修改IP地址时可能会遇到各种问题&#xff0c;例如IP地址无法更改、修改后无…