redis06 redis事务

思维草图

redis事务认识

redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

redis事务的主要作用就是串联多个命令防止别的命令插队。

Multi、Exec、discard

redis事务分2个阶段:组队阶段、执行阶段

  • 组队阶段:只是将所有命令加入命令队列。
  • 执行阶段:依次执行队列中的命令,在执行这些命令的过程中,不会被其他客户端发送的请求命令插队或者打断。

三个命令解释

  • multi:标记一个事务块的开始 
  • exec:执行已经添加到事务块内的命令
  • discard:取消事务
# 示例1:事务被成功执行
redis> MULTI
OK
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

# 示例2:监视 key,且事务成功执行
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "huangz"
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC
1) OK
2) (integer) 1

# 示例3:监视 key,且事务被打断
redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "joe" # 就在这时,另一个客户端修改了 lock_times 的值
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC # 因为 lock_times 被修改, joe 的事务执行失败
(nil)

# 示例4:取消事务,放弃执行事务块内的所有命令
redis> MULTI
OK
redis> PING
QUEUED
redis> SET greeting "hello"
QUEUED
redis> DISCARD
OK

事务的错误处理

情况1:组队中命令有误,导致所有命令取消执行

组队中某个命令出现了错误报告,执行时整个队列中所有的命令都会被取消。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi #开启一个事务块
OK
127.0.0.1:6379(TX)> set name ready
QUEUED
127.0.0.1:6379(TX)> set age 30
QUEUED
127.0.0.1:6379(TX)> set address #命令有问题,导致加入队列失败
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec #执行exec的时候,事务中所有命令都被取消
(error) EXECABORT Transaction discarded because of previous errors.

情况2:组队中没有问题,执行中部分成功部分失败

命令组队的过程中没有问题,执行中出现了错误会导致部分成功部分失败。

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1 #命令1:设置k1的值为v1
QUEUED
127.0.0.1:6379(TX)> incr k1 #命令2:k1的值递增1,由于k1的值不是数字,执行的时候会失败的
QUEUED
127.0.0.1:6379(TX)> set k2 v2 #命令3:设置k2的值为v2
QUEUED
127.0.0.1:6379(TX)> exec #执行命令,1和3命令成功,第2个失败了
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> mget k1 k2 #查看k1和k2的值
1) "v1"
2) "v2"

事务冲突的问题

场景

你的账户中只有10000,有多个人使用你的账户,同时去参加双十一抢购

一个请求想给金额减8000

一个请求想给金额减5000

一个请求想给金额减1000

悲观锁 

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每 次在拿数据的时候都会上锁,这样别人拿到这个数据就会block直到它拿到锁。传统的关系型数据库里面 就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在做操作之前先上锁。

乐观锁

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去那数据的时候都认为别人不会修改,所以 不会上锁,但是在修改的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机 制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。redis就是使用这种check-and-set机制实现事务的。

redis事务总结 

  1. 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
  2. 没有隔离级别的概念:队列中的命令没有提交(exec)之前,都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
  3. 不能保证原子性:事务中如果有一条命令执行失败,后续的命令仍然会被执行,没有回滚。 如果在组队阶段,有1个失败了,后面都不会成功;如果在组队阶段成功了,在执行阶段有哪个命令失败就这条失败,其他的命令则正常执行,不保证都成功或都失败。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

稀碎从零算法笔记Day9-LeetCode:最长公共前缀

题型:字符串 链接:14. 最长公共前缀 - 力扣(LeetCode) 来源:LeetCode 题目描述(红字为笔者添加) 编写一个函数来查找字符串数组中的最长公共前缀(前X个字母相同)。 如果不存在公共前缀&…

【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

目录 1.随机链表的复制 1.2题目描述 1.3题目分析 1.4解题: 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 1.随机链表的复制 一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random 该指针可以指向链表中的任何节点或空节点。 1.2题目描…

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB) 论坛为局域网论坛,仅供内部同事交流使用! 使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M)…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject? 在游戏开发中,有大量的配置数据需要存储,这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt,excel等等 但是你们有没有想过,假设你使用的是json&#x…

Python 面向对象编程——类的使用

一、学习目标 1.掌握类的定义和实例化对象。 2.熟练掌握类的构造函数__init__使用。 3.掌握类的继承机制和使用。 二、相关练习 1、定义一个玩具类Toy(),创建名字为“小汽车”、“手枪”和“积木”的玩具实例,计…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:多态样式)

设置组件不同状态下的样式。 说明: 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 从API Version 11开始支持另一种写法attributeModifier,可根据开发者需要动态设置属性。 stateStyles stateStyl…

微信报修小程序源码

源码获取方式: 1、搜一搜 万能工具箱合集 然后点击资料库,即可获取资源 一、先看Demo(已更新至4.0.0) 想看界面图片的,辛苦你爬一下楼,点击下方查看资源,进入官方demo 二、功能介绍 1、当前版…

二路归并排序的算法设计和复杂度分析and周记

数据结构实验报告 实验目的: 通过本次实验,了解算法复杂度的分析方法,掌握递归算法时间复杂度的递推计算过程。 实验内容: 二路归并排序的算法设计和复杂度分析 实验过程: 1.算法设计 第一步,首先要将数组进行…

计算机网络-第3章 数据链路层

主要内容:两个信道及对应的协议:点对点信道和广播信道,扩展以太网和高速以太网 本章的分组转发为局域网内的转发,不经过路由,网络层分组转为为网络与网络之间的转发,经过路由。局域网属于网络链路层的范围…

苹果群控功能解析与代码分享!

随着移动互联网的飞速发展,智能设备日益普及,苹果设备因其出色的用户体验和稳定的性能受到了广大用户的喜爱,然而,对于开发者而言,如何有效地管理和控制大量的苹果设备成为了一个亟待解决的问题。 一、苹果群控功能概…

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

回收小程序开发,降低企业成本,提高回收利润

近年来,人们的回收意识逐渐强烈,废品回收行业发展非常迅猛,促进了我国的资源回收再利用,我国回收行业也将迎来新的发展机遇。 随着市场规模的扩大,回收行业也正在逐步进行创新。在互联网的支持下,行业中也…

只会Vue的我,用两天学会了react,这个方法您也可以

公众号:需要以下pdf,关注下方 2023已经过完了,让我们来把今年的面试题统计号,来备战明年的金三银四!所以,不管你是社招还是校招,下面这份前端面试工程师高频面试题,请收好。 背景 由…

基于springboot实现保险信息网站系统项目【项目源码+论文说明】

基于springboot实现保险信息网站系统演示 摘要 随着互联网的不断发展,现在人们获取最新资讯的主要途径来源于网上新闻,当下的网上信息宣传门户网站的发展十分的迅速。而保险产品,作为当下人们非常关注的一款能够给人们带来医疗、生活、养老或…

保护模式笔记九 中断门和IDT(中断描述符表)

段选择子: 先直观认识一下GDT和段选择子在逻辑地址转换为线性地址中的作用,例如: 给出逻辑地址:21h:12345678h,需要将其转换为线性地址 a. 选择子SEL21h0000000000100 0 01b,他代表的意思是&#xff1a…

操作系统--绪论

这里写目录标题 什么是操作系统(OS)硬件工作示例引入操作系统目标计算机的产生图灵机通用图灵机计算机 启动电源键开启后,计算机干了什么二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目…

洛谷P8888(吉利题) 实验基地

今天来水一期吉利题。 提醒一下,虽然编号很吉利,但内容可不吉利,做好心理准备!!! 题目背景 小 A 和小 B 用实验基地全新的装备进行了一场世纪蒟蒻之战。 题目描述 众所周知,实验基地的武器…

静态时序分析:SDC约束命令set_disable_timing详解

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 目录 指定对象列表 指定源、目的引脚 指定恢复 简单使用 写在最后 上一章中,我们学习了如何使用set_case_analysis模式分析命令,它通过指定某个端口或引脚为固定值&…

B3619 10 进制转 x 进制

题目描述 给定一个十进制整数 n 和一个小整数 x。将整数 n 转为 x 进制。对于超过十进制的数码,用 A,B ... 表示。 输入格式 第一行一个整数 n; 第二行一个整数 x。 输出格式 输出仅包含一个整数,表示答案。 输入输出样例 …

三星成功研发出业界首款12层堆叠HBM3E

三星电子有限公司成功研发出业界首款12层堆叠HBM3E DRAM——HBM3E 12H,这是迄今为止容量最大的HBM产品。这款新型HBM3E 12H内存模块提供了高达1,280GB/s的史上最高带宽,并拥有36GB的存储容量,相较于之前的8层堆叠HBM3 8H,在带宽和…
最新文章