redis 有没有ACID事务
看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事务的更多相关文章
- Redis(五)事务
Redis(五)事务 引用wiki中关于事务处理的定义: Transaction processing is information processing in computer science th ...
- 【redis专题(9)】事务
Redis支持简单的事务,所谓简单是因为其不支持回滚(回滚是用队列模仿的),与mysql有以下区别 rollback与discard的区别: 如果已经成功执行了2条语句, 第3条语句出错 Rollba ...
- Golang 实现 Redis(8): TCC分布式事务
本文是使用 golang 实现 redis 系列的第八篇, 将介绍如何在分布式缓存中使用 Try-Commit-Catch 方式来解决分布式一致性问题. godis 集群的源码在Github:Godi ...
- redis不完整的事务实现Transaction
使用场景 redis一个命令执行是单线程的,不用担心并发冲突,如果你想有几个命令想像一个命令一样,在这几个命令执行过程中不会执行别的客户端发来的命令 ,也就是原子性,就可以用 redis Transa ...
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- Redis教程(八):事务详解
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/135.html?1455806987 一.概述: 和众多其它数据库一样,R ...
- Redis学习笔记(7)-事务
package cn.com; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis. ...
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- redis发布订阅、事务、脚本
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...
随机推荐
- Socket编程:listen()函数英文翻译
作者:C语言达人 链接:https://zhuanlan.zhihu.com/p/24951131 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇翻译的list ...
- android_activity_研究(一)
android中活动的概念(activity)是一个很重要的东东.这里有很多东东值得好好研究.最好的研究来源当然是官网啦,所以本人这里写一点对官网文章的研究心得. 一.活动(activity)的概念 ...
- MyBatis 接口多参数的处理方法
From<MyBatis从入门到精通> 1.接口类中增加的方法: /* 2.7 多个接口参数的用法 多个参数时,可以选取的方案有:使用Map类型或者使用@Param注解 使用Map类型作为 ...
- Jenkins Ci系列目录
Jenkins入门篇 1.Jenkins入门之界面概览 2.Jenkins入门之新建任务 3.Jenkins入门之导航操作 4.Jenkins入门之任务基本操作 5.Jenkins入门之执行Power ...
- python的ORM技巧记录
# -*- coding:utf-8 -*- from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, In ...
- Scrum 使用絮叨
关于Scrum 的一些絮叨 Scrum 的推行的基础在于全员参与,全员协作,包含Dev, QA(quality assurance) ,BA(Business analyst)以及Supporter ...
- 深入理解 JavaScript 面向对象
我们在学习编程时,避免不了会接触一个概念,叫:面向对象编程(Object-oriented programming,缩写:oop) (不是搞对象那个对象哈),其实我们的编程方式,不止有面向对象,还有 ...
- Leetcode solution 291: Word Pattern II
Problem Statement Given a pattern and a string str, find if str follows the same pattern. Here follo ...
- Baozi Leetcode Solution 205: Isomorphic Strings
Problem Statement Given two strings s and t, determine if they are isomorphic. Two strings are isomo ...
- C#3.0新增功能02 匿名类型
连载目录 [已更新最新开发文章,点击查看详细] 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用. 每 ...