✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人
个人主页:Leo的博客
当前专栏: Java从入门到精通
✨特色专栏: Redis7从实战到高级
本文内容:Redis事务
️个人小站 :个人博客,欢迎大家访问
个人知识库:Leo知识库,欢迎大家访问
官网: https://redis.io/docs/manual/transactions/
我这里做了一些简单的翻译
可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。
总结说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
我们对数据库中事务处理的相关理论有了一个基本的认识,或许这个世界上的数据库系统千差万别,但我相信在事务处理这个问题上它们最终会殊途同归,就像我们解决并发过程中的冲突问题,常规的做法依然是加锁一样,这是我之所以要花费精力去理解和解释这些理论知识的原因,技术可谓是日新月异,如果我们总是一味地为新技术而疲于奔命,那么或许我们会渐渐地失去对这个行业的热爱,我相信原理永远比框架更为重要。
redis事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。
Redis中的事务是可以视为一个队列,即我们可以通过MULTI开始一个事务,这相当于我们声明了一个命令队列。接下来,我们向Redis中提交的每条命令,都会被排入这个命令队列。当我们输入EXEC命令时,将触发当前事务,这相当于我们从命令队列中取出命令并执行,所以Redis中一个事务从开始到执行会经历 开始事务 、 命令入队 和 执行事务 三个阶段。下面是一个在Redis中使用事务的简单示例:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET name "Leo"
QUEUED
127.0.0.1:6379> SADD Program_Language "C++" "C#" "Jave" "Python"
QUEUED
127.0.0.1:6379> GET name
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 4
3) "Leo"
我们可以注意到Redis中的事务和通常意义上的事务基本上是一致的,即
1.单独的隔离操作 | Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的 |
---|---|
2.没有隔离级别的概念 | 因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了 |
3.不保证原子性 | Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力 |
4.排它性 | Redis会保证一个事务内的命令依次执行,而不会被其它命令插入 |
Redis事务和MySQL事务有以下不同点:
总的来说,Redis和MySQL事务处理有很多不同之处,它们各自适用于不同的场景。如果需要高并发的数据操作,可以使用Redis事务;如果需要对数据进行持久化存储和复杂的数据关联查询,则可以使用MySQL事务。
官网: https://redis.io/docs/manual/transactions/
官网说明:
一个语法出错,全体连坐。如果任何一个命令语法有错,Redis会直接返回错误,所有的命令都不会执行
官网说明:
补充:
注意和传统数据库事务的区别,不一定要么全部成功要么全部失败
Redis使用Watch来提供乐观锁定,类似于CAS(Check-and-Set)
watch key [key …]
unwatch
小结
一旦执行了exec之前加的监控锁都会被取消掉
当客户端连接丢失的时候(比如退出链接),所有东西都会被取消监视
开启: 以 multi
开始一个事务
入队: 将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
执行: 有 exec
命令触发事务