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

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个失败了,后面都不会成功;如果在组队阶段成功了,在执行阶段有哪个命令失败就这条失败,其他的命令则正常执行,不保证都成功或都失败。

相关文章:

  • web组态(BY组态)接入流程
  • CAN总线位时序的介绍
  • OpenMMlab AI实战营第四期培训
  • MySQL——性能调优
  • [蓝桥杯 2020 省 B1] 整除序列
  • 如何在十几秒内高效实现几十万条数据的快速插入
  • TestNG @Test注释属性- threadPoolSize属性
  • 自适应哈希索引
  • python网络爬虫教程笔记(1)
  • 【组合递归】【StringBuilder】Leetcode 17. 电话号码的字母组合
  • Android开发技术总结,附项目源码
  • 【Golang】介绍
  • 微服务中的Feign:优雅实现远程调用的秘密武器(一)
  • 麒麟KYLINSOS服务器操作系统SP3安装
  • Java8的Stream执行机制
  • [case10]使用RSQL实现端到端的动态查询
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • MySQL-事务管理(基础)
  • Python利用正则抓取网页内容保存到本地
  • vue--为什么data属性必须是一个函数
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 多线程事务回滚
  • 类orAPI - 收藏集 - 掘金
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 使用权重正则化较少模型过拟合
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我看到的前端
  • 一道面试题引发的“血案”
  • 正则表达式小结
  • 【云吞铺子】性能抖动剖析(二)
  • raise 与 raise ... from 的区别
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​人工智能书单(数学基础篇)
  • # 数据结构
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (九)One-Wire总线-DS18B20
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十) 初识 Docker file
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)Scala的“=”符号简介
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net 验证控件和javaScript的冲突问题
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @ModelAttribute注解使用
  • @private @protected @public
  • @RequestMapping 的作用是什么?
  • [1127]图形打印 sdutOJ
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20170728]oracle保留字.txt
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [JavaWeb学习] tomcat简介、安装及项目部署