1. redis的持久化

Redis的持久化主要分为两部分:RDB(Redis DataBase), AOF(Append Only File)

2. 什么是redis 的持久化       

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。

整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,

那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

3. Fork

fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)
数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

redis通过fork产生子进程

父进程继续处理client请求 ,子进程负责将快照写入临时文件

子进程写完后,用临时文件替换原来的快照文件,然后子进程退出

4. 快照(RDB机制)保存的是数据

特点:Redis会在特定的时点,把内存中的数据,以dump.rdb镜像文件的方式,存储在硬盘中,如果Redis运行过程中发生任何问题,则redis通过dump.rdb文件进行恢复,从而保证数据的持久化
通过修改redis.conf文件中的如下参数可以定义镜像文件的名字,以及存放位置

5. RDB机制的触发时机

配置文件中默认的快照配置(RDB)

1.自动触发 通过fork 子进程写 dump.rdb

a) Redis的服务正常关闭时,触发

b) 通过redis.conf中配置的内容 决定触发时机

 2. 手工触发

save命令   通过redis的主进程 写 dump.rdb    save时只管保存,其它不管,全部阻塞

bgsave命令 通过fork 子进程写 dump.rdb        Redis会在后台异步进行快照操作,

redis是单进程的不存在多进程的应用场景

3. 优势

适合大规模的数据恢复

对数据完整性和一致性要求不高

4. 劣势

在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改

fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

5. 如何停止

动态所有停止RDB保存规则的方法:redis-cli config set save ""

6. 重点

RDB是整个内存的压缩过的Snapshot,RDB 的数据结构,可以配置复合的快照触发条件。

默认: 一分钟改了一万次

5分钟改了10次

15分钟给了1次

如果想禁用RDB持久化策略,只要不设置任何Save指令,或者给Save传入一个空字符串参数也可以。

 6. AOF(Append Only File)机制

特点:以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis

重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

Aof保存的是appendonly.aof文件

1. AOF启动/修复/恢复

启动:修改默认的appendonly no,改为yes

修复:将有数据的aof文件复制一份保存到对应目录(config get dir)

恢复:重启redis然后重新加载

2.如果Aof异常终止

1. 备份被写坏的AOF文件

2. redis-check-aof --fix  appendonly.aof进行修复

3. 恢复:重启redis然后重新加载

7. AOF 与RDB的优先级

1. 如果aof与rdb同时存在 会优先使用aof

2. 修改配置文件 dir  /usr/local/redis_dbfile/ 决定了rdb和aof

8. AOF 写日志的时机

  1. appendfsync 推荐 everysec

9. Aofrewirte AOF日志重写

1. 手工:bgrewriteaof

2. 自动:修改redis.conf

注意:AOF重写 不是基于上一次AOF文件进行重写而是基于当前Redis内存中的数据 进行重写

3. 重写的原因(rewrite):

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,

只保留可以恢复数据 ttt 的最小指令集.可以使用命令bgrewriteaof

4.重写的原理:

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),

遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,

而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

5.触发机制

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发

6. 优势

每修改同步:appendfsync always   同步持久化 每次发生数据变更会被立即记录到磁盘  性能较差但数据完整性比较好

每秒同步:appendfsync everysec    异步操作,每秒记录   如果一秒内宕机,有数据丢失。

不同步:appendfsync no 从不同步

7.劣势:

相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb

aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

10 AOF 与RDB 的使用

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些 命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾. Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大

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

2. 同时开启两种持久化方式

在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.

RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢? 作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),

快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

3.性能建议

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。

如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。

如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构

11. Redis持久化的坑

  1. RDB机制 ---->  AOF机制 切换过程 AOF机制 appendonly.aof文件主
    RDB机制 ----->  AOF机制  热切换(不改变配置文件)使用下面的命令config set appendonly yes 或者 config set save ””  rdb关了

config set appendonly yes 设置这个命令后aof会发起重写机制将当前装填写入到appendonly,aof文件中

 12. Redis 的内存管理

  1. 与memcached不同,没有实现自己的内存池
  2. 在v2.4.4 以前,默认使用标准的内存分配函数(libc)可以选择使用tcmalloc
  3. 在v2.4.4以后jemalloc称为代码的一部分

也就是内存碎片jemalloc最小 tcmalloc次

使用命令 :make MALLOC = libc

make MALLOC = jemalloc

https://www.cnblogs.com/iamsach/p/8485401.html

1)AOF持久化开启且存在AOF文件时,优先加载AOF文件。

2)AOF关闭或者AOF文件不存在时,加载RDB文件。

3)加载AOF/RDB文件成功后,Redis启动成功。

4)AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。

事务管理待续。。。。。。。

redis的持久化 与事务管理的更多相关文章

  1. 【Spring实战】—— 16 基于JDBC持久化的事务管理

    前面讲解了基于JDBC驱动的Spring的持久化管理,本篇开始则着重介绍下与事务相关的操作. 通过本文你可以了解到: 1 Spring 事务管理的机制 2 基于JDBC持久化的事务管理 Spring的 ...

  2. Redis整理第三波(生存时间、事务管理)

    expire  设置生存时间 Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即到期后数据销毁. TTL查看key的剩余时间,当返回值为-2时,表示键被删除. 当 ...

  3. Redis的订阅、事务、持久化

    1.Redius的订阅: 运用关键字subscribe订阅: 关键字publish发布: 发布后,订阅的页面才会出现发布的内容. 2.Redis事务: Redis事务与mysql的事务不同,mysql ...

  4. Redis的持久化机制与内存管理机制

    1.概述 Redis的持久化机制有两种:RDB 和 AOF ,这两种机制有什么区别?正式环境应该采用哪种机制? 我们的服务器内存资源是有限的,如果内存被Redis的缓存占满了怎么办?这就要看Redis ...

  5. Redis数据库之KEY的操作与事务管理

    目的 了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,主要培养对KEY的操作命令运用的能力.重点掌握对KEY信息的管理.事务常规管理和事务回滚操作. KEYS命令的练习,对K ...

  6. Spring企业级程序设计 • 【第4章 Spring持久化层和事务管理】

    全部章节   >>>> 本章目录 4.1 配置数据源资源 4.1.1 JdbcTemplate介绍 4.1.2通过ComboPooledDataSource创建数据源 4.1. ...

  7. redis + 主从 + 持久化 + 分片 + 集群 + spring集成

    Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...

  8. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

  9. SpringBoot2 整合JTA组件,多数据源事务管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个 ...

随机推荐

  1. S3C2440—6.串口的printf实现

    文章目录 一.框架 二.printf函数原理 2.1 printf的声明 2.2 参数解读 2.3 如何得到可变参数的值 2.4 解决变参的宏定义 2.5 完成printf函数的封装 三.结合UART ...

  2. STM32—TIMx实现编码器四倍频

    文章目录 一.储备知识 二.TIMx的编码器模式介绍 1.计数边沿设置 2.选择极性和使能 3.使能 4.计数方向 三.代码部分 一.储备知识 通过STM32的定时器编码器接口模式对编码器进行四倍频, ...

  3. 【AI】Pytorch_LearningRate

    From: https://liudongdong1.github.io/ a. 有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦 ...

  4. 安全|常见的Web攻击手段之CSRF攻击

    对于常规的Web攻击手段,如XSS.CRSF.SQL注入.(常规的不包括文件上传漏洞.DDoS攻击)等,防范措施相对来说比较容易,对症下药即可,比如XSS的防范需要转义掉输入的尖括号,防止CRSF攻击 ...

  5. PsSetCreateProcessNotifyRoutineEx 创建回调函数

    转载自http://blog.csdn.net/yushiqiang1688/article/details/5209597 最近要做一个进程监控的程序,功能很简单,就是创建和退出进程的时候,能触发我 ...

  6. python画循环圆

    import turtle for i in range(100,0,-5): # 从100到0循环递减每次减5 turtle.circle(i,90) 不懂为啥第一次运行会出错,错了再运行一遍for ...

  7. linux上传下载文件(转载https://www.jb51.net/article/143112.htm)

    转载于:https://www.jb51.net/article/143112.htmLinux下目录复制:本机->远程服务器 1 scp -r /home/shaoxiaohu/test1 z ...

  8. Promise.resolve()与Promise

    //Promise.resolve()和Promise.reject()常用来生成已经被决议为失败或者成功的promise案例 //Promise.reject()简单一些,不管传给它什么值,它决议为 ...

  9. 【Qt pro 文件配置】

    一.默认配置 默认的pro文件配置如下: 如果采用Qt默认的pro配置,其编译后产生的文件会默认集中分布在debug和release目录下,如下图的obj和moc等文件对后续打包发布并没有意义. 二. ...

  10. Qt 自定义事件

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...