看redis官网的介绍:

  

  

  redis确实是有事务的,但是和传统的ACID是否相同呢?

  原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  一致性(Consistency)
    事务前后数据的完整性必须保持一致。
  
隔离性(Isolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  
持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

  原子性:

    将多个操作当成一个整体来执行 要么全部执行,要么一个也不执行

    在redis中,事务的multi命令后的操作,都将顺序生成在一个队列中,命令不会立即执行,队列中所有的命令会等待exec命令的提交后,才会被一次性执行

     

    可以看到key1最终结果为'b'

    执行过程:

    

      如果我们的队列中有命令执行失败了呢? 整个队列会都失败吗?

      

      

     key2被设值为'a',这一步是成功的,但incr 只能对数字进行操作,而'a'为字符串,显然会出错,但是查询key2结果,发现值还是'a',并未进行回滚,说明一个命令失败,不会整个队列命令失败,也就是说,redis不能保证原子性

   为什么?

mysql的回滚是因为和写binlog有关,binlog记录的每一步操作,在事务提交前就已经将事务命令和操作命令记录在了log中,而redis是等exec执行完成后才写log,并且只记录操作命令,mysql的回滚是要耗时且占用线程资源的,而redis的理念就是简单快速,只能说应用场景不同而已

   

  一致性:

  一致性是指在事务执行前后,都应是一致的,而无论事务执行成功与否

  redis不是一个关系型数据库,上面就说到redis不支持回滚,也就没有mysql那种关系型数据库的原子性一致性

  单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

  事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做:

  

  

  隔离性:

   隔离性指多个事务并发执行,各个事务间不会互相影响,并且在并发状态下执行的事务与串行执行的结果应该是完全相同的

   redis 是单线程的,也就意味着它总是以串行方式执行,同一时刻内不会有其他事务打断当前事务的执行。redis的事务具有隔离性

  持久性:

   持久性指事务还行完毕后,结果就应该被保存在持久化存储器中,就是服务宕机,也能保证数据不丢失

  redis有三种存储模式:

  1. 只在内存中运行、存储,不进行持久化,服务宕机后,数据全部丢失

  2. RDB模式的持久化存储, 定时隔一段时间通过fork子进程进行持久化,这就导致了如果早间隔同步时间内发生宕机,那这段时间的数据将会丢失,RDB是redis默认持久化方式

  3. AOF模式是以写日志的方式记录写、改、删除操作 进行持久化,redis重启后会根据日志记录从前到后执行,将数据进行恢复

  所以redis是支持事务持久性的

  

 

  

   

redis 有没有ACID事务的更多相关文章

  1. Redis(五)事务

    Redis(五)事务 引用wiki中关于事务处理的定义: Transaction processing is information processing in computer science th ...

  2. 【redis专题(9)】事务

    Redis支持简单的事务,所谓简单是因为其不支持回滚(回滚是用队列模仿的),与mysql有以下区别 rollback与discard的区别: 如果已经成功执行了2条语句, 第3条语句出错 Rollba ...

  3. Golang 实现 Redis(8): TCC分布式事务

    本文是使用 golang 实现 redis 系列的第八篇, 将介绍如何在分布式缓存中使用 Try-Commit-Catch 方式来解决分布式一致性问题. godis 集群的源码在Github:Godi ...

  4. redis不完整的事务实现Transaction

    使用场景 redis一个命令执行是单线程的,不用担心并发冲突,如果你想有几个命令想像一个命令一样,在这几个命令执行过程中不会执行别的客户端发来的命令 ,也就是原子性,就可以用 redis Transa ...

  5. Redis系列二之事务及消息通知

    一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...

  6. Redis教程(八):事务详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/135.html?1455806987 一.概述: 和众多其它数据库一样,R ...

  7. Redis学习笔记(7)-事务

    package cn.com; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis. ...

  8. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  9. redis发布订阅、事务、脚本

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

随机推荐

  1. android_aidl

    好久未更新博客了.人都是这样,刚开始对某一样东东冲劲十足,时间一长,很难坚持下去了,我这博客也是.所以我要打破成规,继续更新. 本次博客谈谈adil的用法.aidl的全称叫什么来着忘了,不过不要紧,重 ...

  2. android_activity_研究(一)

    android中活动的概念(activity)是一个很重要的东东.这里有很多东东值得好好研究.最好的研究来源当然是官网啦,所以本人这里写一点对官网文章的研究心得. 一.活动(activity)的概念 ...

  3. Python之爬虫有感(一)

    urllib.request.Request('URL',headers = headers)User-Agent 是爬虫和反爬虫斗争的第一步,发送请求必须带User—Agent使用流程:    1. ...

  4. JDK1.8--体验Stream表达式,从一个对象集合中获取每一个对象的某一个值返回新集合

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.更多IT.编程案例.资料请联系QQ:1280023003 百战不败,依不自称常胜,百败不颓,依能奋力前行.——这才是真正的堪称强大!! --- 开 ...

  5. Python入门基础(8)

    上一篇介绍了一些python中函数的基本用法,那么,现在就来谈一谈python中的一些内置函数吧 python中的内置函数 1.map()函数 map()函数接受两个参数值,一个是函数,一个是Iter ...

  6. python菜鸟基础知识(一)

    第三章 基础 3.1程控制语句 3.1.1if语句 1.单if ​ if 关键字 空格 条件 冒号 ​ 缩进 结果 print(1) if 3 > 2: print(9) print(8) 2 ...

  7. python 2.7 - 3.5 升级之路 (一) : 准备阶段开发环境 -- pip3, vitualEnv, pycharm

    背景 由于之前项目采用的版本是Python2.7, 考虑到Python 2.7 到明年(2020年后将会停止更新),以及为了更好的适应中文和拥抱新的特性.我们决定将其从python 2 升级到最新的 ...

  8. 网络框架,互联网的组成,OSI七层协议,抽象层

    6.25自我总结 1.网络框架 1.单机 单机游戏 以下两个基于网络的 2.CS架构 cs--->client客户/server服务 服务端(应用程序)一个就够了,客户端(应用程序)可以有多个 ...

  9. 第二篇:"空空如也"的博客应用

    文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 建立博客应用 我们已经建立了 django 博客的项目工程,并且成功地运行了它.不过到目前为止这一切都还只是 django 为 ...

  10. FD limit (65535) too low for maxconn=65535/maxsock=131084.Please raise 'ulimit-n' to 131084 or more to avoid any trouble.

    在安装完Haproxy启动时报错,诸如:FD limit (65535) too low for maxconn=65535/maxsock=131084.Please raise 'ulimit-n ...