精华内容
下载资源
问答
  • 研究了具有HollingⅡ类功能反应的食物链时滞系统,得到了持久性和全局渐进稳定的条件.
  • 文章目录ACID特性#1 原子#2 一致#3 隔离#4 持久性 ACID特性 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子(Atomicity)、一致(Consistency)、隔离...

    ACID特性

    数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)

    #1 原子性

    原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。可采用“A向B转账”这个例子来说明解释在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。

    #2 一致性

    一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
    如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)。保障机制(也从两方面着手):数据库层面会在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,check约束等)和触发器设置;此外,数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的。业务的一致性一般由开发人员进行保证,亦可转移至数据库层面。

    #3 隔离性

    多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
    在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。关于隔离性中的事务隔离等级

    #4 持久性

    这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。

    展开全文
  • 文章综述了持久性氯代有机污染物的降解功能物种,并分析了功能物种降解氯代有机物的关键酶和降解机理.在此基础上,从固定化、基因工程、酶工程、生物反应器等方面对降解功能物种应用于持久性氯代有机污染物污染场地...
  • 数据库的ACID(原子、一致、隔离持久性

    万次阅读 多人点赞 2018-05-08 15:45:37
    不要迷路哦~ ACID特性 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子(Atomicity)、一致(Consistency)、隔离(Isolation)、持久性(Durability) 所谓事务,它是一...

    任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

     

     

    ACID特性

    数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

    所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)

    详解

    1. 原子性

    原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。

    可采用“A向B转账”这个例子来说明解释

    在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。

    2. 一致性

    一致性是指在事务开始之前和事务结束以后数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性

    如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)。

    保障机制(也从两方面着手):数据库层面会在一个事务执行之前和之后,数据会符合你设置的约束唯一约束,外键约束,check约束等)和触发器设置;此外,数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的。业务的一致性一般由开发人员进行保证,亦可转移至数据库层面。

    3. 隔离性

    多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

    在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据

    事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。

    关于隔离性中的事务隔离等级(事务之间影响),参见相应博文

    4. 持久性

    这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)

    write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。

    展开全文
  • 中位提议外部存储 与Mesos外部持久性存储管理功能有关的正在进行的工作
  • 研究了一类具有Holling Ⅳ类功能反应的变系数多种群捕食者-食饵系统的持久性生存.利用比较定理, 得到种群一致持久生存的充分条件.该结果改进了已有结论.
  • Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情要...于是,人们就归纳出事务的第一个特性:原子(Atomicity)。我靠,一点都不神秘嘛。 特别是在数据库领域,事务是一个

    Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情要有始有终,不能半途而废。 事务也是这样,不能做一半就不做了,要么做完,要么就不做。也就是说,事务必须是一个不可分割的整体,就像我们在化学课里学到的原子,原子是构成物质的最小单位。于是,人们就归纳出事务的第一个特性:原子性(Atomicity)。我靠,一点都不神秘嘛。

    特别是在数据库领域,事务是一个非常重要的概念,除了原子性以外,它还有一个极其重要的特性,那就是:一致性(Consistency)。也就是说,执行完数据库操作后,数据不会被破坏。打个比方,如果从 A 账户转账到 B 账户,不可能因为 A 账户扣了钱,而 B 账户没有加钱吧。如果出现了这类事情,您一定会非常气愤,什么 diao 银行啊!

    当我们编写了一条 update 语句,提交到数据库的一刹那间,有可能别人也提交了一条 delete 语句到数据库中。也许我们都是对同一条记录进行操作,可以想象,如果不稍加控制,就会出大麻烦来。我们必须保证数据库操作之间是“隔离”的(线程之间有时也要做到隔离),彼此之间没有任何干扰。这就是:隔离性(Isolation)。要想真正的做到操作之间完全没有任何干扰是很难的,于是乎,每天上班打酱油的数据库专家们,开始动脑筋了,“我们要制定一个规范,让各个数据库厂商都支持我们的规范!”,这个规范就是:务隔离级别(Transaction Isolation Level)能定义出这样牛逼的规范真的挺不容易的,其实说白了就四个级别:

      1.READ_UNCOMMITTED

      2.READ_COMMITTED

      3.REPEATABLE_READ

      4.SERIALIZABLE

    千万不要去翻译,那只是一个代号而已。从上往下,级别越来越高,并发性越来越差,安全性越来越高,反之则反。

    当我们执行一条 insert 语句后,数据库必须要保证有一条数据永久地存放在磁盘中,这个也算事务的一条特性, 它就是:持久性(Durability)

    归纳一下,以上一共提到了事务的 4 条特性,把它们的英文单词首字母合起来就是:ACID,这个就是传说中的“事务 ACID 特性”!

    真的是非常牛逼的特性啊!这 4 条特性,是事务管理的基石,一定要透彻理解。此外还要明确,这四个家伙当中,谁才是老大?

    其实想想也就清楚了:原子性是基础,隔离性是手段,持久性是目的,真正的老大就是一致性。数据不一致了,就相当于“江湖乱套了”。所以说,这三个小弟都是跟着“一致性”这个老大混,为他全心全意服务。

    这四个家伙当中,其实最难理解的反倒不是一致性,而是隔离性。因为它是保证一致性的重要手段,是工具,使用它不能有半点差池,否则后果自负!怪不得数据库行业专家们都要来研究所谓的事务隔离级别了。其实,定义这四个级别就是为了解决数据在高并发下所产生的问题,那又有哪些问题呢?

    三类数据读问题

      1.Dirty Read(脏读)

      2.Unrepeatable Read(不可重复读)

      3.Phantom Read(幻读)

    两类数据更新问题

      1.第一类丢失更新

      2.第二类丢失更新

    首先看看“脏读”,看到“脏”这个字,我就想到了恶心、肮脏。数据怎么可能脏呢?其实也就是我们经常说的“垃圾数据”了。比如说,有两个事务,它们在并发执行(也就是竞争)。看看以下这个表格,您一定会明白我在说什么:



    余额应该为 1100 元才对!请看 T6 时间点,事务 A 此时查询余额为 900 元,这个数据就是脏数据,它是事务 A 造成的,明显事务没有进行隔离,渗过来了,乱套了。

    所以脏读这件事情是非常要不得的,一定要解决掉!让事务之间隔离起来才是硬道理。


    不可重复读又怎么解释呢?还是用类似的例子来说明:



    事务 A 其实除了查询了两次以外,其他什么事情都没有做,结果钱就从 1000 变成 0 了,这就是重复读了。可想而知,这是别人干的,不是我干的。其实这样也是合理的,毕竟事务 B 提交了事务,数据库将结果进行了持久化,所以事务 A 再次读取自然就发生了变化。

    这种现象基本上是可以理解的,但在有些变态的场景下却是不允许的。毕竟这种现象也是事务之间没有隔离所造成的,但我们对于这种问题,似乎可以忽略。


    幻读。我去!Phantom 这个单词不就是“幽灵、鬼魂”吗?刚看到这个单词时,真的把我的小伙伴们都给惊呆了。怪不得这里要翻译成“幻读”了,总不能翻译成“幽灵读”、“鬼魂读”吧。其实意义就是鬼在读,不是人在读,或者说搞不清楚为什么,它就变了,很晕,真的很晕。还是用一个示例来说话吧:



    银行工作人员,每次统计总存款,都看到不一样的结果。不过这也确实也挺正常的,总存款增多了,肯定是这个时候有人在存钱。但是如果银行系统真的这样设计,那算是玩完了。这同样也是事务没有隔离所造成的,但对于大多数应用系统而言,这似乎也是正常的,可以理解,也是允许的。银行里那些恶心的那些系统,要求非常严密,统计的时候,甚至会将所有的其他操作给隔离开,这种隔离级别就算非常高了(估计要到 SERIALIZABLE 级别了)。


    第一类丢失更新,A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题,通过下面的账户取款转账就可以看出来:


    但是,在当前的四种任意隔离级别中,都不会发生该情况,不然绝对乱套,我都没提交事务只是撤销,就把别人的给覆盖了,这也太恐怖了。


    第二类丢失更新,B事务覆盖A事务已经提交的数据,造成A事务所做操作丢失



    归纳一下,以上提到了事务并发所引起的跟读取数据有关的问题,各用一句话来描述一下:

      1.脏读:事务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。

      2.不可重复读:事务 A 读取了事务 B 已提交的更改数据。

      3.幻读:事务 A 读取了事务 B 已提交新增数据。

    第一条是坚决抵制的,后两条在大多数情况下可不作考虑。

    这就是为什么必须要有事务隔离级别这个东西了,它就像一面墙一样,隔离不同的事务。看下面这个表格,您就清楚了不同的事务隔离级别能处理怎样的事务并发问题:



    根据您的实际需求,再参考这张表,最后确定事务隔离级别,应该不再是一件难事了。

    JDBC 也提供了这四类事务隔离级别,但默认事务隔离级别对不同数据库产品而言,却是不一样的。我们熟知的MySQL 数据库的默认事务隔离级别就是 READ_COMMITTED,Oracle、SQL Server、DB2等都有有自己的默认值。我认为 READ_COMMITTED 已经可以解决绝大多数问题了,其他的就具体情况具体分析吧。

    提示:在 Java.sql.Connection 类中可查看所有的隔离级别。

    我们知道 JDBC 只是连接 Java 程序与数据库的桥梁而已,那么数据库又是怎样隔离事务的呢?其实它就是“锁”这个东西。当插入数据时,就锁定表,这叫“锁表”;当更新数据时,就锁定行,这叫“锁行”。当然这个已经超出了我们今天讨论的范围,所以还是留点空间给我们的 DBA 同学吧,免得他没啥好写的了。

    除了 JDBC 给我们提供的事务隔离级别这种解决方案以外,还有哪些解决方案可以完善事务管理功能呢?

    不妨看看 spring 的解决方案吧,其实它是对 JDBC 的一个补充或扩展。它提供了一个非常重要的功能,就是:事务传播行为(TransactionPropagation Behavior)

    确实够牛逼的,Spring 一下子就提供了 7 种事务传播行为,这 7 种行为一出现,真的是亮瞎了!

      1.PROPAGATION_REQUIRED

      2.RROPAGATION_REQUIRES_NEW

      3.PROPAGATION_NESTED

      4.PROPAGATION_SUPPORTS

      5.PROPAGATION_NOT_SUPPORTED

      6.PROPAGATION_NEVER

      7.PROPAGATION_MANDATORY

    看了 Spring 参考手册之后,更是晕了,这到底是在干嘛?

    首先要明确的是,事务是从哪里来?传播到哪里去?答案是,从方法 A 传播到方法 B。Spring 解决的只是方法之间的事务传播,那情况就多了,比如:

    1. 方法 A 有事务,方法 B 也有事务。
    2. 方法 A 有事务,方法 B 没有事务。
    3. 方法 A 没有事务,方法 B 有事务。
    4. 方法 A 没有事务,方法 B 也没有事务。 

    这样就是 4 种了,还有 3 种特殊情况。还是用我的 Style 给大家做一个分析吧:

        @Transactional  
        void A(){  
        }  
        @Transactional  
        void B(){  
           A();  
        }  

    假设事务从方法 A 传播到方法 B,您需要面对方法 B,问自己一个问题:

    方法 A 有事务吗?

    1. 如果没有,就开启一个事务如果有,就加入当前事务(方法A加入到方法B)。这就是 PROPAGATION_REQUIRED,它也是 Spring 提供的默认事务传播行为,适合绝大多数情况。
    2. 如果没有,就开启一个事务如果有,就将当前事务挂起。这就是 RROPAGATION_REQUIRES_NEW,意思就是创建了一个新事务,它和原来的事务没有任何关系了。
    3. 如果没有,就开启一个事务;如果有,在当前事务中嵌套其他事务。这就是 PROPAGATION_NESTED,也就是传说中的“嵌套事务”了,所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)。
    4. 如果没有,就以非事务方式执行如果有,就使用当前事务。这就是 PROPAGATION_SUPPORTS,这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正我是支持你的。
    5. 如果没有,就非事务方式执行如果有,就将当前事务挂起。这就是 PROPAGATION_NOT_SUPPORTED,这种方式非常强硬,没有就没有,有我也不支持你,把你挂起来,不鸟你。
    6. 如果没有,就非事务方式执行;如果有,就抛出异常。这就是 PROPAGATION_NEVER,这种方式更猛,没有就没有,有了反而报错,确实够牛的,它说:我从不支持事务!
    7. 如果没有,就抛出异常;如果有,就使用当前事务。这就是 PROPAGATION_MANDATORY,这种方式可以说是牛逼中的牛逼了,没有事务直接就报错,确实够狠的,它说:我必须要有事务!

    看到我上面这段解释,小伙伴们是否已经感受到,被打通任督二脉的感觉?多读几遍,体会一下,就是您自己的东西了。

    需要注意的是 PROPAGATION_NESTED,不要被它的名字所欺骗,Nested(嵌套),所以凡是在类似方法 A 调用方法 B 的时候,在方法 B 上使用了这种事务传播行为,如果您真的那样做了,那您就错了。因为您错误地以为 PROPAGATION_NESTED 就是为方法嵌套调用而准备的,其实默认的 PROPAGATION_REQUIRED 就可以帮助您,做您想要做的事情了。

    Spring 给我们带来了事务传播行为,这确实是一个非常强大而又实用的功能。除此以外,也提供了一些小的附加功能,比如:

    1.事务超时(Transaction Timeout)为了解决事务时间太长,消耗太多的资源,所以故意给事务设置一个最大时常,如果超过了,就回滚事务。

    2.只事务(Readonly Transaction)为了忽略那些不需要事务的方法,比如读取数据,这样可以有效地提高一些性能。

    最后,推荐大家使用 Spring 的注解式事务配置,而放弃 XML 式事务配置。因为注解实在是太优雅了,当然这一切都取决于您自身的情况了。

    在 Spring 配置文件中使用:

    ?
    ...  
    <tx:annotation-driven/>  
    ... 

    在需要事务的方法上使用:

    @Transactional  
    public void xxx() {  
        ...  
    }

    可在 @Transactional 注解中设置:事务隔离级别、事务传播行为、事务超时时间、是否只读事务。

    简直是太完美了,太优雅了!

    最后,有必要对本文的内容做一个总结,免费赠送一张高清无码思维导图:


    转至:http://blog.csdn.net/lovesomnus/article/details/44459675

    展开全文
  • Redis持久

    千次阅读 多人点赞 2019-09-27 11:45:31
    文章目录RDB 持久化(快照持久化)AOF 持久化重写/压缩AOFRedis 4.0 对持久化机制的优化如何选择合适的持久化方式 Redis 是内存型数据库,为了之后重用数据(比如重启机器、机器故障之后回复数据),或者是为了防止...

    Redis 是内存型数据库,为了之后重用数据(比如重启机器、机器故障之后回复数据),或者是为了防止系统故障而将数据备份到一个远程位置,需要将内存中的数据持久化到硬盘上。

    Redis 提供了RDB和AOF两种持久化方式。默认是只开启RDB,当Redis重启时,它会优先使用AOF文件来还原数据集。

    RDB 持久化(快照持久化)

    RDB 持久化:将某个时间点的所有数据都存放到硬盘上。

    可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。如果系统发生故障,将会丢失最后一次创建快照之后的数据。如果数据量很大,保存快照的时间会很长。

    快照持久化是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

    #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
    save 900 1              
    
    #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
    save 300 10            
    
    #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
    save 60 10000        
    

    根据配置,快照将被写入dbfilename选项指定的文件里面,并存储在dir选项指定的路径上面。如果在新的快照文件创建完毕之前,Redis、系统或者硬件这三者中的任意一个崩溃了,那么Redis将丢失最近一次创建快照写入的所有数据。

    举个例子:假设Redis的上一个快照是2:35开始创建的,并且已经创建成功。下午3:06时,Redis又开始创建新的快照,并且在下午3:08快照创建完毕之前,有35个键进行了更新。如果在下午3:06到3:08期间,系统发生了崩溃,导致Redis无法完成新快照的创建工作,那么Redis将丢失下午2:35之后写入的所有数据。另一方面,如果系统恰好在新的快照文件创建完毕之后崩溃,那么Redis将丢失35个键的更新数据。

    创建快照的办法有如下几种:

    • BGSAVE命令 :客户端向Redis发送 BGSAVE命令 来创建一个快照。对于支持BGSAVE命令的平台来说(基本上所有平台支持,除了Windows平台),Redis会调用fork来创建一个子进程,然后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。
    • SAVE命令 :客户端还可以向Redis发送 SAVE命令 来创建一个快照,接到SAVE命令的Redis服务器在快照创建完毕之前不会再响应任何其他命令。SAVE命令不常用,我们通常只会在没有足够内存去执行BGSAVE命令的情况下,又或者即使等待持久化操作执行完毕也无所谓的情况下,才会使用这个命令。
    • save选项 :如果用户设置了save选项(一般会默认设置),比如 save 60 10000,那么从Redis最近一次创建快照之后开始算起,当“60秒之内有10000次写入”这个条件被满足时,Redis就会自动触发BGSAVE命令。
    • SHUTDOWN命令 :当Redis通过SHUTDOWN命令接收到关闭服务器的请求时,或者接收到标准TERM信号时,会执行一个SAVE命令,阻塞所有客户端,不再执行客户端发送的任何命令,并在SAVE命令执行完毕之后关闭服务器。
    • 一个Redis服务器连接到另一个Redis服务器:当一个Redis服务器连接到另一个Redis服务器,并向对方发送SYNC命令来开始一次复制操作的时候,如果主服务器目前没有执行BGSAVE操作,或者主服务器并非刚刚执行完BGSAVE操作,那么主服务器就会执行BGSAVE命令

    如果系统真的发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。因此,快照持久化只适用于即使丢失一部分数据也不会造成一些大问题的应用程序。不能接受这个缺点的话,可以考虑AOF持久化。

    AOF 持久化

    AOF 持久化:将写命令添加到 AOF 文件(Append Only File)的末尾。

    与快照持久化相比,AOF持久化 的实时性更好,因此已成为主流的持久化方案。默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:

    appendonly yes
    

    开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof。

    使用 AOF 持久化需要设置同步选项,从而确定写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。在Redis的配置文件中存在三种同步方式

    选项同步频率
    always每个写命令都同步,这样会严重降低Redis的速度
    everysec每秒同步一次
    no让操作系统来决定何时同步

    appendfsync always 可以实现将数据丢失减到最少,不过这种方式需要对硬盘进行大量的写入而且每次只写入一个命令,十分影响Redis的速度。另外使用固态硬盘的用户谨慎使用appendfsync always选项,因为这会明显降低固态硬盘的使用寿命。

    appendfsync everysec 为了兼顾数据和写入性能,用户可以考虑 appendfsync everysec选项 ,让Redis每秒同步一次AOF文件,Redis性能几乎没受到任何影响。而且这样即使出现系统崩溃,用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候,Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。

    appendfsync no 选项一般不推荐,这种方案会使Redis丢失不定量的数据而且如果用户的硬盘处理写入操作的速度不够的话,那么当缓冲区被等待写入的数据填满时,Redis的写入操作将被阻塞,这会导致Redis的请求速度变慢。

    随着服务器写请求的增多,AOF 文件会越来越大。Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。

    虽然AOF持久化非常灵活地提供了多种不同的选项来满足不同应用程序对数据安全的不同要求,但AOF持久化也有缺陷——AOF文件的体积太大。

    重写/压缩AOF

    AOF虽然在某个角度可以将数据丢失降低到最小而且对性能影响也很小,但是极端的情况下,体积不断增大的AOF文件很可能会用完硬盘空间。另外,如果AOF体积过大,那么还原操作执行时间就可能会非常长。

    为了解决AOF体积过大的问题,用户可以向Redis发送 BGREWRITEAOF命令 ,这个命令会通过移除AOF文件中的冗余命令来重写(rewrite)AOF文件来减小AOF文件的体积。BGREWRITEAOF命令和BGSAVE创建快照原理十分相似,所以AOF文件重写也需要用到子进程,这样会导致性能问题和内存占用问题,和快照持久化一样。更糟糕的是,如果不加以控制的话,AOF文件的体积可能会比快照文件大好几倍。

    文件重写流程:

    文件重写流程
    和快照持久化可以通过设置save选项来自动执行BGSAVE一样,AOF持久化设置以下参数

    auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size
    

    选项自动执行BGREWRITEAOF命令。举例:假设用户对Redis设置了如下配置选项并且启用了AOF持久化。那么当AOF文件体积大于64mb,并且AOF的体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行BGREWRITEAOF命令。

    auto-aof-rewrite-percentage 100  
    auto-aof-rewrite-min-size 64mb
    

    无论是AOF持久化还是快照持久化,将数据持久化到硬盘上都是非常有必要的,但除了进行持久化外,用户还必须对持久化得到的文件进行备份(最好是备份到不同的地方),这样才能尽量避免数据丢失事故发生。如果条件允许的话,最好能将快照文件和重新重写的AOF文件备份到不同的服务器上面。

    随着负载量的上升,或者数据的完整性变得越来越重要时,用户可能需要使用到复制特性。

    Redis 4.0 对持久化机制的优化

    Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。

    如果把混合持久化打开,AOF 重写的时候就直接把 RDB 的内容写到 AOF 文件开头。这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据。当然缺点也是有的, AOF 里面的 RDB 部分就是压缩格式不再是 AOF 格式,可读性较差。

    如何选择合适的持久化方式

    • 一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

    • 如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。

    • 有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。

    • 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。

    展开全文
  • Memcache 持久性分布式数据库MemcacheDB

    千次阅读 2015-04-04 01:43:44
    通过为Memcached增加Berkeley DB的持久化存储机制和异步主辅复制机制,使Memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合需要超高性能读写速度、持久化保存的应用场景,例如,将memcachedb应用...
  • php持久登录、记住我功能实现

    万次阅读 2014-03-02 10:37:38
    永久登录的存在降低了你的验证机制的安全,但它增加了可用。不是在用户每次访问时麻烦用户进行身份验证,而是提供了记住登录的选择。 据我观察,最常见的有缺陷的永久登录方案是将用户名和密码保存在一个cookie...
  • 什么是数据持久性

    千次阅读 2010-09-02 16:36:56
    转自:http://www.ixpub.net/thread-1510739-1-1.html 看看: ... ...J2EE 平台为管理企业数据持久性提供了一组丰富的选项,但如何选择适合于您体系结构的选项呢?Kyle Gabhart 介绍了 J2EE 最佳的数...
  • 这是一个代码生成器,用于生成一堆结构和函数,以几行代码来实现持久性代码,并保留PostgreSQL提供的所有功能。 构造:使用PostgreSQL生成具有低抽象持久性的生成器概述是否厌倦了使用ORM时PostgreSQL提供的所有功能...
  • Redis windows 测试redis持久功能

    千次阅读 2012-06-15 22:47:14
    下载完之后解压到你磁盘上的,我的是F:\redis-2.0.2 还需要在redis根目录增加一个redis的配置文件redis.conf,文件具体内容有: # Redis configuration file example ...# By default Redis does
  • 什么是持久性框架?

    千次阅读 2008-01-04 15:50:00
    何谓持久性框架 持久性框架是一组软件服务,将应用程序与其使用和操纵的数据源分离。持久性框架位于机构的数据源之上,隐藏访问这些数据源的数据访问API(如JDBC,JDO或实体EJB)。提供的服务应完全抽象和从这个数据...
  • ActiveMQ中的消息持久性

    千次阅读 2007-03-02 20:18:00
    这文章是在网上看到的,还没来得及试验,先拿下来再说。...939A197D2798715B!125.entry ActiveMQ很好的支持了消息的持久性...消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受
  • 消息的持久性 消息确认机制 两种方法拒绝消息 否定确认(Negative Acknowledgements) 设置预取消息的数量 消息分配策略 消息的持久性为了保证消息的可靠,需要对消息进行持久化。 为了保证RabbitMQ在重启、奔溃...
  • 008:Redis-快照持久化和AOF持久

    千次阅读 2019-02-15 17:06:03
    持久功能: redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到磁盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)里面。 数据保存到硬盘的过程就成为“持久化”效果。 Snap shotting...
  • 分别是优先级队列、消息顺序、消息分发、持久化。 正文 目录 前言 正文 优先级队列 消息顺序 消息分发 持久化 优先级队列 顾名思义,优先级高的具备优先消费的特权。 设置方式是在声明队列的时候...
  • Session的主要数据被存储在服务器内存中,而服务器会为每个在线用户创建一个Session对象,当在线用户很多时,例如同时有几万或是几十万在线的情况下,...springboot2.x对session持久化是默认禁用的 如果想打开
  • 我们在跑程序时,分六批单独投喂给GPU计算和将六批整合成一批投喂给...搜索NVIDIA GPU持久模式 参考文章1:配置 Nvidia GPU 主机的运行环境 参考文章2:https://docs.nvidia.com/deploy/driver-persistence/inde...
  • 1. 摘要: 随着以docker为代表的容器技术的发展,为应用的开发、测试、运维带来了巨大的便捷。容器技术不仅在互联网企业应用广泛,在传统银行业的IT中也发展迅速。...由于数据对于银行的重要,不可避免
  • 持久

    千次阅读 2012-05-01 10:40:47
    持久化是将程序数据在持久状态和瞬时状态间转换的机制。 编辑本段定义  持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是...
  • 要实现会话的持久化,也就是实现HttpSessionActivationListener接口。实现此接口的JavaBean,可以感知自己被活化(从硬盘到内存)和钝化(从内存到硬盘)的过程。如果需要同时保存Session中的JavaBean。 则JavaBean也要...
  • Redis持久化的原理及优化

    千次阅读 2019-05-26 09:00:56
    Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定。 RDB 保存数据快照至一个RDB文件中,用于持久化。RDB操作和Mysql Dump...
  • redis持久

    千次阅读 2020-05-24 17:19:05
    支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。 Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半...
  • redis的两种持久化方式详解

    千次阅读 2018-04-27 16:07:02
    在实际开发中,为了保证数据的完整,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据。如果仅仅是使用redis而不进行持久化配置的话,当redis重启之后,并不能达到...
  • AOF持久

    万次阅读 多人点赞 2018-08-30 01:47:31
    RDB持久化是将进程数据写入文件,而AOF持久化(即Append Only File持久化),则...与RDB相比,AOF的实时更好,因此已成为主流的持久化方案。 1. 开启AOF Redis服务器默认开启RDB,关闭AOF;要开启AOF,需要在配...
  • Redis RDB 持久化详解

    千次阅读 2019-07-04 00:23:08
    Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的...antirez 在《Redis 持久化解密》一文中说,一般来说有三种常见的策略来进行持久化操作,防止数据损坏: 方法1 是数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 334,615
精华内容 133,846
关键字:

性功能如何持久