事务

一旦成功所有的成功,一个失败,所有一些列连续动作都失败

事务的基本操作
  • 开启事务

multi

  • 作用
    设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中
  • 执行事务

exec

  • 作用
    设定事务的结束位置,同时执行事务。与multi成对出现,成对使用

    注意:加入事务的命令暂时到任务队列中,并没有立即执行,只有执行exec命令才开始执行
事务定义过程中发现问题,怎么办?
  • 取消事务

discard

  • 作用
    终止当前事务定义,发生在multi之后,exec之前
事务的工作流程

事务的注意事项
  • 语法错误
    指命令书写格式有误

  • 处理结果
    如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会被执行。包括那些语法正确的命令

  • 运行错误
    指命令格式正确,但是无法正常的执行。例如对list进行incr操作

  • 处理结果
    能够正确运行的命令会执行,运行错误的命令不会执行
    注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚。

手动进行事务回滚

  • 记录操作过程中被影响的数据之前的状态
    单数据:string
    多数据:hash,list,set,zset
  • 设置指令恢复所有的被修改的项
    单数据:直接set(注意周边属性,例如时效)
    多数据:修改对应值或整体克隆复制

事务锁

业务场景1

业务分析

  • 多个客户端有可能同时操作一组数据,并且该数据一旦被操作修改后,将不适用于继续操作
  • 在操作之前锁定要操作的数据,一旦发生变化,终止当前操作
基于特定条件的事务执行——锁

解决方案

  • 对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行

watch key1 [key2…]

  • 取消对所有key的监视

unwatch

业务场景2
天猫双11热卖过程中,对已经售罄的获取追加补货,且补货完成。客户购买热情高涨,3秒内将所有商品购买完毕。本次补货已经将库存全部清空,如何避免最后一件商品不被多人同时购买?【超卖问题】
业务分析

  • 使用watch监控一个key有没有改变已经不能解决问题,此处要监控的是具体数据
  • 虽然redis是单线程的,但是多个客户端对同一个数据同时进行操作时,如何避免不被同时修改?
基于特定条件的事务执行——分布式锁

解决方案

  • 使用setnx设置一个公共锁

setnx lock-key value

利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功

  • 对于返回设置成功的,拥有控制权,进行下一步的具体业务操作
  • 对于返回设置失败的,不具有控制权,排队或等待
    操作完毕通过del操作释放锁

dek lock-key

业务场景
依赖分布式锁的机制,某个用户操作时对应客户机宕机,并且此时已经获取到锁,如何解决?
业务分析

  • 由于锁操作由用户控制加锁,必定会存在加锁后未解锁的风险
  • 需要解锁操作不能仅依赖用户控制,系统级别要给出对应的保底处理方案
    解决方案
  • 使用expire为锁key添加时间限定,到时不释放,放弃锁

expire lock-key second
pexpire lock-key millisenconds

由于操作通常都是微秒或者毫秒级,因此该锁设定时间不宜设置过大。具体时间需要业务测试后确认

  • 例如:持有锁的操作最长执行时间127ms,最短执行时间7ms
  • 测试百万次最长执行时间对应命令的最大消耗时,测试百万次网络延迟平均耗时
  • 锁时间设定推荐:最大耗时* 120%+平均网络延迟*110%
  • 如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可

【Redis】11.Redis事务、事务锁相关推荐

  1. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  2. 分布式锁的应用场景_分布式缓存技术Redis:高级应用(主从、事务与锁、持久化)...

    安全性设置 设置客户端操作秘密 redis安装好后,默认情况下登陆客户端和使用命令操作时不需要密码的.某些情况下,为了安全起见,我们可以设置在客户端连接后进行任何操作之前都要进行密码验证.修改redi ...

  3. redis笔记——redis事务及锁应用

    1.redis支持简单的事务 2.redis 和 mysql事务的对比 Mysql Redis 开启 start transaction multi(并不执行,放在一个队列里) 语句 普通sql 普通 ...

  4. Redis的事务和锁机制(乐观锁和悲观锁)

    Redis学习笔记(四) 1,Redis事务的定义 2,Redis事务操作的三个基本命令 3,解决Redis中的事务冲突(乐观锁和悲观锁) 3.1,悲观锁 3.2,乐观锁 3.3,Redis中使用乐观 ...

  5. Redis事务和锁机制

    Redis事务和锁机制 1.Redis中的事务 1.1 什么是事务 1.2 特征 1.3 事务执行的3个阶段 1.4 事物的命令 1.5 事务内部的错误处理 1.6 Redis事物的原子性 1.7 R ...

  6. Redis 事务与锁 机制

    本笔记基于bilibili尚硅谷Redis学习视频整理而来 Redis 事务与锁 机制 Redis的事务定义 Redis主要使用MULTI, EXEC, DISCARD 和 WATCH 命令来实现事务 ...

  7. 【Redis】Redis安装、应用场景、数据类型、配置文件(很全)、发布订阅、事务、分布式锁、持久化、主从复制、集群等

    文章目录 Redis笔记 Redis 介绍 应用场景 相关技术 安装 Redis 操作及数据类型 Redis 键操作(Key) Redis 字符串(String) Redis 列表(List) Red ...

  8. 【Redis学习】Transaction事务管理

    1.相关命令: (1)MULTI 标记一个事务块的开始.事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行. 返回值:总是返回 OK . redis ...

  9. python实现redis三种cas事务操作

    cas全称是compare and set,是一种典型的事务操作. 简单的说,事务就是为了存取数据库中同一数据时不破坏操作的隔离性和原子性,从而保证数据的一致性. 一般数据库,比如MySql是如何保证 ...

最新文章

  1. python个人网站开发_python 全栈开发,Day81(博客系统个人主页,文章详情页)
  2. ICE专题:ICE起步
  3. java 线程组和线程_Java多线程 线程组原理及实例详解
  4. 一种通过U盘热插拔的升级方法
  5. 第六十六期:软件架构之道的一次感悟
  6. 对称加密算法-DES以及DESede算法
  7. 用jQuery实现页面遮罩弹出框
  8. jQuery设置iframe的高度
  9. PCWorld:火狐浏览器已宣告死亡【转】
  10. 2021年茶艺师(初级)考试资料及茶艺师(初级)模拟试题
  11. inter,amd,arm公司以及x86,arm,mips等架构关系
  12. Appium +iOS 自动化测试全网最全教程(实践、总结 、踩坑)
  13. 如何解决Kodi的YouTube“配额超过”问题
  14. Python学习之re.compile与findall
  15. 如何禁止计算机被网络访问,局域网内如何禁止别人访问自己的电脑
  16. 【XML】dom4j解析
  17. 移动软件开发:第一个安卓应用小程序
  18. 基于属性的访问控制(ABAC)
  19. 流媒体服务器搭建之Live555
  20. CISA提醒修复Zoho ManageEngine RCE漏洞

热门文章

  1. mac无法访问samba共享 提示输入用户名密码
  2. (转)8种常见机器学习算法比较
  3. 移动开发框架,第【一】弹:QuoJs 官方文档(汉化版)
  4. 搜索引擎学习(一)初识Lucene
  5. 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)
  6. [No000013D].Net 项目代码风格参考
  7. 8、泛型程序设计与c++标准模板库2.4列表容器
  8. 网易2017校招编程:优雅的点
  9. 高行健---江西赣州人
  10. 视觉基础与开发思路-第九节形态学操作