作家
登录

Redis缓存技术学习系列之事务处理

作者: 来源: 2017-04-10 15:35:08 阅读 我要评论

Redis中的事务处理

在本系列的第一篇文┞仿中,我们重要针对Redis中的“键”和“值”进行了进修。我们可以留意到,Redis是一个C/S架构的数据库,在我们今朝的认知中,它是经由过程终端中的一条条敕令来存储和攫取的,即它是一个异常典范的“请求-响应”模型。可是我们知道在实际的应用中,我们要面对的或许是更为复杂的营业逻辑,因为Redis中不存在传统关系型数据库中表的概念,是以在应用Redis的过程中,我们要面对两个实际的问题,即若何更好的保护数据库中的”键“、如安在高效履行敕令的同时包管敕令履行成功。对于前者,我认为这是一个设计汕9依υ?题,而对于后者,我认为这是一个技巧汕9依υ?题。所以,这篇文┞仿的核心内容就是找到这两个问题的谜底。带着如许的问题出发,我们就可以正式进入这篇文┞仿的主题:Redis中的事务处理。

Redis缓存技巧进修系列之事务处理

大年夜数据库事务说起

​ 平日我们说起数据库都弗成避免的要提到事务,那么什么是事务呢?事务是指作为单个逻辑工作单位履行的一系列操作。所以,起首事务是一系列操作,这一系列操作具有二态性,即完全地履行或者完全地不履行。是以事务处理可以确保除非事务单位内的所有操作的成功完成,不然不会永远更新面向数据的资本。我们这里举一个例子,数据库中除萌芽操作以外,插入(Insert)、删除(Delete)和更新(Update)这三种操作都邑对数据造成影响,因为事务处理可以或许包管一系列操作可以完全地履行或者完全不履行,是以在一个事务被提交今后,该事务中的任何一条SQL语句在被履行的时刻,都邑生成一条撤销日记(Undo Log),而撤销日记中记录的是和当前擦作完全相反的操作,比瘸谰除的相反操作是插入,插入的相反操作是删除等。我们平日所说的事务回滚其实就是去履行这些插销日记里的相反操作,这同样告诉我们一个事理,只有事务中的一系列操作完全履行的情况下可以回滚,如不雅是在不测情况下导致事务中的一系列操作没有完全履行,这个时刻我们是不克不及包管数据必定可以回滚的。

​ 在数据库相干理论中,一个逻辑工作单位想要成为事务,就必须知足ACID,即原子性、一致性、隔离性和持久性。(1):原子性这个概念其实就是指,一个事务内的所有SQL操作都是一个整体,是以只有所有的SQL操作都完全履行成功,该事务方可以认为提交成功。如不雅在提交事务过程中某一条SQL语句履行掉败,则全部事务必须回滚到事务提交前的状况。(2):而一致性这个概念则是指,事务在完成的时刻,必须要包管所有的数据都保持一致的状况,而落实到数据库的各个构成部分上,则请求开辟人员可以或许包管数据、索引、束缚、日记等在事务前后具备一致性。(3):隔离性这个概念重要针对并发,其核心思惟就是不合的并发事务对数据产生的修改必须是互相隔离的,假设有两个不合的事务A和B并发履行,那么对A来讲,它在履行前的状况只有两种,即B履行前和B履行后。同理,对B来讲同样是如斯,如许的特点我们就称为隔离性。(4):持久性相对简单,是指事务完成今后它对数据的影响是永远性的。

​ 好了,截止到今朝为止,我们对数据库中事务处理的相干理论有了一个根本的熟悉,或许这个世界上的数据库体系千差万别,但我信赖在事务处理这个问题上它们最终会殊途同归,就像我们解决并发过程中的冲突问题,惯例的做法依然是加锁一样,这是我之所以要花费精力去懂得和解释这些理论常识的原因,技巧可谓是日新月异,如不雅我们老是一味地为新技巧而疲于奔命,那么或许我们会逐渐地掉去对这个行业的酷爱,我信赖道理永远比框架更为重要,没有体系进修过计算机专业的课程,这件工作让我至今都颇为遗憾。Redis中的事务是可以视为一个队列,即我们可以经由过程MULTI开端一个事务,这相当于我们声清楚明了一个敕令队列。接下来,我们向Redis中提交的每条敕令,都邑被排入这个敕令队列。当我们输入EXEC敕令时,将触发当前事务,这相当于我们大年夜敕令队列中掏出敕令并履行,所以Redis一一个事务大年夜开端到履行会经历 开端事务 、 敕令入队 和 履行事务 三个阶段。下面是一个在Redis中应用事务的简单示例:

  1. 127.0.0.1:6379> MULTI 
  2. OK 
  3. 127.0.0.1:6379> SET Book_Name "GIt Pro" 
  4. QUEUED 
  5. 127.0.0.1:6379> SADD Program_Language "C++" "C#" "Jave" "Python"  
  6. QUEUED 
  7. 127.0.0.1:6379> GET Book_Name 
  8. QUEUED 
  9. 127.0.0.1:6379> EXEC 
  10. 1) OK 
  11. 2) (integer) 4 
  12. 3) "GIt Pro" 

我们可以留意到Redis中的事务和通平平易近义上的事务根本上是一致的,即


  推荐阅读

  Go语言HTTP Server源码分析

func (mux *ServeMux) ServeHTTP (w ResponseWriter, r *Request) { if r.RequestURI == "*" { if r.ProtoAtLeast(1, 1) { w.Header().Set("Connection", "close") } w.WriteHea>>>详细阅读


本文标题:Redis缓存技术学习系列之事务处理

地址:http://www.17bianji.com/lsqh/34686.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)