首页 > 数据库 >Redis笔记(三):事务

Redis笔记(三):事务

时间:2023-05-19 22:12:49浏览次数:36  
标签:事务 EXEC redis Redis 笔记 命令 执行

什么是Redis事务

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

Redis事务在编译错误时回滚,运行时错误跳过。

Redis事务相关命令和使用

MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。

EXEC:执行事务中的所有操作命令。

DISCARD:取消事务,放弃执行事务块中的所有命令。

WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。

UNWATCH:取消WATCH对所有key的监视。

如何理解Redis与事务的ACID?

  • 原子性atomicity

首先通过上文知道 运行期的错误是不会回滚的,很多文章由此说Redis事务违背原子性的;而官方文档认为是遵从原子性的。

Redis官方文档给的理解是,Redis的事务是原子性的:所有的命令,要么全部执行,要么全部不执行。而不是完全成功。

  • 一致性consistency

redis事务可以保证命令失败的情况下得以回滚,数据能恢复到没有执行之前的样子,是保证一致性的,除非redis进程意外终结。

  • 隔离性Isolation

redis事务是严格遵守隔离性的,原因是redis是单进程单线程模式(v6.0之前),可以保证命令执行过程中不会被其他客户端命令打断。

但是,Redis不像其它结构化数据库有隔离级别这种设计。

  • 持久性Durability

redis事务是不保证持久性的,这是因为redis持久化策略中不管是RDB还是AOF都是异步执行的,不保证持久性是出于对性能的考虑。

CAS操作实现乐观锁

check-and-set (CAS):被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

Redis事务执行步骤

通过上文命令执行,很显然Redis事务执行是三个阶段:

  • 开启:以MULTI开始一个事务
  • 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
  • 执行:由EXEC命令触发事务

当一个客户端切换到事务状态之后, 服务器会根据这个客户端发来的不同命令执行不同的操作:

  • 如果客户端发送的命令为 EXEC 、 DISCARD 、 WATCH 、 MULTI 四个命令的其中一个, 那么服务器立即执行这个命令。
  • 与此相反, 如果客户端发送的命令是 EXEC 、 DISCARD 、 WATCH 、 MULTI 四个命令以外的其他命令, 那么服务器并不立即执行这个命令, 而是将这个命令放入一个事务队列里面, 然后向客户端返回 QUEUED 回复。

标签:事务,EXEC,redis,Redis,笔记,命令,执行
From: https://www.cnblogs.com/Bota5ky/p/17416438.html

相关文章

  • es笔记六之聚合操作之指标聚合
    本文首发于公众号:Hunter后端原文链接:es笔记六之聚合操作之指标聚合聚合操作,在es中的聚合可以分为大概四种聚合:bucketing(桶聚合)mertic(指标聚合)matrix(矩阵聚合)pipeline(管道聚合)bucket类似于分类分组,按照某个key将符合条件的数据都放到该类别的组中mertic计......
  • kubebuilder笔记
    一、kubebuilder作用提供脚手架工具初始化CRDs工程,自动生成boilerplate代码和配置提供代码库封装底层的K8sgo-client二、kubebuilder整体流程用户自定义crd,将自定义的crd注册到scheme中,这样通过GVK能找到对应的go的struct,也能通过go的struct找对对应的GVKCache监听S......
  • 人月神话 读书笔记 03
    第9章削足适履9.1程序有多大?除了运行时间以外,它所占据的空间也是主要开销。当系统设计者认为对用户而言,常驻程序内存的形式比加法器、磁盘等更加有用时,他会将硬件实现中的一部分移到内存上。相反的,其他的做法是非常不负责任的。由于规模是软件系统产品用户成本中如此大的一个......
  • 人件集 人性化的软件开发阅读笔记03
    《人件集人性化的软件开发》第三部分工作组织第八章:团队的目标和规划这一章主要讲述如何制定合理的团队目标和规划,以及如何实现这些目标和规划。作者提出,确定特定的、可衡量的目标,并建立一个可靠的评估机制,以便团队能够不断改进和实现更好的效果。我认为这一章非常实用,对于团......
  • Redis笔记(二):三种特殊类型
    geospatial地理位置GEOADDkey[NX|XX][CH]longitudelatitudemember[longitudelatitudemember...]地球两极无法直接添加经度纬度GEODIST#单位m,km,mi,ftGEOHASHGEOPOSGEORADIUSGEORADIUSBYMEMBERJava中的数据结构......
  • sqli-lab学习笔记(学习笔记)(1-10)
    经常会犯的错误:1.在hackbar里面忘记用%23替代#2.在用下一条语句的时候忘记更改limit的值导致结果显示不出来3.双注入里面的语句忘记加()日志是我后来想到发的,前面几关也都基础简单的,giantbranch大佬写的挺好的很详细,我也是按他的一步步学习来的,然后在里面增加自己的知识点和......
  • 开发手记:Redis中zset查询的range
    问题描述从Redis中查询关注列表(使用zset存储),但是查询到的记录总是比应有的记录数少一个Set<Integer>targetIds=redisTemplate.opsForZSet().reverseRange(key,offset,offset+limit-1);调试于是去检查Redis中置顶键zset中的所有数据,发现自己对zset相关命令似乎并不太......
  • ④ActiveMQ 与 SpringBoot 集成——(动力节点)ActiveMQ笔记
    第四章ActiveMQ与SpringBoot集成4-1ActiveMQ与SpringBoot集成集成配置1、加载springboot的activeMQ的依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><depen......
  • Docker容器安装示例(nginx、redis、nacos、oracle)
    1.nginx示例1.创建容器1.查看是否有nginx镜像dockerimages2.如果没有镜像,可以搜索镜像dockersearchnginx3.指定版本拉取nginxdockerpullnginx:1.20.04.查看镜像dockerimages5.创建容器(-d后台运行,-p容器80端口映射到宿主机8080端口,指定名称nginx-test,指定镜像ID:......
  • JavaScript学习笔记: 函数
    概念在js中,函数与其他类型一样,是一个支持所有操作的值,是一个对象,是编程语言里的“一等公民”函数是一个代码块,每被调用一次,其代码就会执行一次。函数有一个被{}包裹的函数体,具体的逻辑代码就写在里面。使用return关键字返回函数的计算结果,如果没有返回值,那函数调用表达式的值......