首页 > 数据库 >Redis 数据库的事务机制

Redis 数据库的事务机制

时间:2023-04-05 13:14:29浏览次数:33  
标签:事务 WATCH 数据库 Redis 命令 key 执行

1、Redis 事务机制

1.1 事务的定义

  事务是指一系列操作数据库的步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。   1.2 Redis 的事务   同样,Redis 中的事务也是一组命令的集合,至少是两个或两个以上的命令。Redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。   Redis 事务的主要作用就是串联多个命令,防止别的命令插队。   2、 Redis 事务相关命令  Multi: 开启事务 语法: multi 作用:标记一个事务的开始。事务内的多条命令会按照先后顺序,被放进一个队列当中。 返回值:总是返回 ok  exec :提交事务 语法:exec 作用:执行所有事务块内的命令 返回值:事务内的所有执行语句内容,事务被打断(影响)返回 nil  Discard:取消事务 语法:discard 作用:取消事务,放弃执行事务块内的所有命令 返回值:总是返回 ok  watch 语法:watch key [key ...] 作用:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动, 那么事务将被打断。 返回值:总是返回 ok  unwatch 语法:unwatch 作用:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC命令 或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了 。 返回值:总是返回 ok   3、事务的实现 3.1 正常执行事务 事务的执行步骤: 开启事务, 其次向事务队列中加入命令,最后执行事务提交。   3.2 事务故障 1:执行 exec 命令之前,入队命令错误   事务执行 exec 之前,入队命令错误(语法错误;严重错误导致服务器不能正常工作),则放弃事务。   事务执行 exec 之前,组队中某个命令出现了报告错误,执行时事务终止,整个的所有队列都会被取消。   3.3 事务故障 2:执行 exec 命令之后,队列命令执行错误   在 exec 执行后的所产生的错误, 即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。Redis 在事务失败时不进行回滚,而是继续执行余下的命令。   3.4 正常放弃事务   执行discard命令。   4、Redis 的 watch 机制 4.1 事务冲突 (1)悲观锁   悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会等待,直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。   (2)乐观锁   乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis 就是利用这种 check-and-set 机制实现事务的。   4.2 Redis 的 WATCH 机制   WATCH 机制:使用 WATCH 监视一个或多个 key,跟踪 key 的 value 修改情况,如果有 key 的 value 值在事务 EXEC 执行之前被修改了,则整个事务就被取消。EXEC 返回提示信息,表示事务已经失败。   事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。   使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行。   何时取消 key 的监视(WATCH)?   ①WATCH 命令可以被调用多次。对键的监视从 WATCH执行之后开始生效,直到调用 EXEC 为止。不管事务是否成功执行,对所有键的监视都会被取消。   ②当客户端断开连接时,该客户端对键的监视也会被取消。   ③UNWATCH 命令可以手动取消对所有键的监视。    

标签:事务,WATCH,数据库,Redis,命令,key,执行
From: https://www.cnblogs.com/qiqi-yi/p/17289202.html

相关文章

  • 分布式锁和事务
    1.分布式锁的实现方式?1.基于数据库实现-mysql行锁2.基于zookeeper-CP模式3.基于Redissetnx实现-AP模式4.Redis框架Redission,RedisLock要求:保证一致性zk实现分布式锁保证可用性redis实现分布式锁2.Zookeeper实现分布式锁原理:zookeeper节点路径不能重复,保证唯一性......
  • Redis事务与Lua脚本
    Redis的事务没办法保证一致性,使用Lua脚本也不能保证。Lua脚本能保证一致性,而且比redis的事务实习要简洁健壮。转载:https://maimai.cn/article/detail?fid=1538576512&efid=SQ3XsywteU9lIxil766Lxw......
  • 蓝图的使用、g对象、数据库连接池
    蓝图的使用#blueprint翻译过来的,称之为蓝图#作用是:之前全在一个py中写flask项目,后期肯定要划分目录#不用蓝图,划分目录no_blueprint_flask#项目名src#核心源码位置__init__.py#包里面实例化得到了app对象,mode......
  • flask_day03:蓝图的使用、g对象、数据库连接池
    目录回顾蓝图的使用不用蓝图,划分目录蓝图的使用步骤使用蓝图,划分小型项目目录使用蓝图,划分大型项目目录g对象g对象是什么?使用场景g和session有什么区别?数据库连接池flask操作mysql使用步骤回顾1.cbv的使用 写一个类继承MethodView,写get、post。。。 类属性decorators=[auth......
  • mysql数据库安装
    参考连接1、超级详细的mysql数据库安装指南2、MySQL安装过程中,出现CheckRequirements缺少C++动态库即MicrosoftVisualC++2013Redistributable问题二、安装步骤(基本和第一个参考链接相同,下面是差异的地方)1、检查安装要求,不可以点击Next,点击Execute会出现错误。提示没有......
  • 数据库系统原理之数据库应用设计与开发实例
    数据库应用设计与开发实例第一节需求描述与分析在此,结合某高校个性化课程在线选课的实际需求,给出一个简化的需求分析一、功能性需求1管理员后台模块学生信息管理教师信息管理课程信息管理班级信息管理2学生使用模块查询课程浏览所选课程查询成绩3教师使用模......
  • Redis未授权访问Getshell
    漏洞成因有些redis绑在0.0.0.0:6379,没有开启验证或者没有设置对未知ip来源进行限制以及默认的空密码就导致了redis默认访问但是这个普遍的漏洞极可能造成后门植入getshell,也可能造成反弹shell权限维持,甚至会造成ssh直接免密连接服务器开始复现搭建环境服务器操作系统为ubuntu......
  • flask之蓝图的使用-g对象-数据库连接池
    目录flask之蓝图的使用-g对象-数据库连接池昨日内容补充今日内容详细1蓝图的使用2g对象3数据库连接池补充flask之蓝图的使用-g对象-数据库连接池昨日内容补充#session执行流程 open_session:前端写到cookie到后端后端取出cookie对应的value值解密转到session对象中后续......
  • Android 原生 SQLite 数据库的一次封装实践
    作者:LiBingyan本文主要讲述原生SQLite数据库的一次ORM封装实践,给使用原生数据库操作的业务场景(如:本身是一个SDK)带来一些启示和参考意义,以及跟随框架的实现思路对数据库操作、APT、泛型等概念更深一层的理解。实现思路:通过动态代理获取请求接口参数进行SQL拼凑,并以接口返回值(泛型)......
  • Redis 在 vivo 推送平台的应用与优化实践
    一、推送平台特点vivo推送平台是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,支持百亿级的通知/消息推送,秒级触达移动用户。推送平台的特点是并发高、消息量大、送达及时性较高。目前现状最高......