2019独角兽企业重金招聘Python工程师标准>>>

redis是基于内存的数据库。基于内存的数据库速度虽然快,但是却有一个严重的弊端:当服务器突然宕机或者断电时,内存里的数据都会丢失。Redis提供了两种持久化的方式,可以解决这个问题:内存快照(snapshotting)和日志追加(Append-only file)。

内存快照
内存快照是redis的默认持久化方式,是将内存中的数据以快照方式写入二进制文件中,默认文件名为dump.rdb。修改配置文件中的dbfilename 可以修改文件名称。
Redis每隔一段时间进行一次内存快照操作,客户端使用 save 或者 bgsave 命令通知Redis进行一次内存快照操作。save命令在主线程中保存内存快照,Redis由单线程处理所有请求,执行save操作可能阻塞其他客户端请求,从而导致不能快速响应请求,所以建议不要使用save命令。另外需要注意的是,内存快照每次都把内存数据完整的写入硬盘,而不是只写入增量数据。所以如果数据量大,写入操作比较频繁,会严重影响性能。
在配置文件中修改 save <seconds> <changes> 会改变save的执行。save的参数表示经过 seconds 秒或者数据更新 changes 次会进行一次内存快照操作。可以同时设置多个不同条件,只需要满足其中一个就会触发快照操作。

比如默认的设置

当满足900秒内有1次更改,或者300秒内10次更改,或者60秒内10000次更改,就会进行快照处理。要注意的是,这里的900是指每900秒处理一次,而不是只要900秒以内有改变就会一直执行。

快照的运行方式:

  1. Redis 调用 fork() ,同时拥有父进程和子进程。
  2. 子进程将数据集写入到一个临时 RDB 文件中。
  3. 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

日志追加
日志追加(aof)方式是把增加、修改数据的命令通过 write 函数追加到文件尾部(默认是appendonly.aof)。重启Redis的时候会读取appendonly.aof文件中的所有命令并执行,从而把数据写入内存中。操作系统内核的I/O接口可能存在缓存,所以日志追加方式不能立即写入文件中,这样就有可能造成部分数据的丢失。为了解决这个问题,Redis又提供了几种方法,通过修改配置文件告诉Redis应该在什么时候使用fsync函数强制操作系统将缓存写入硬盘。通过修改配置文件中的 appendfsync 可以修改写入缓存配置。

appendonly <yes | no> 启动日志追加
appendonlyfsync <always | everysec | no>
always 每次收到增加或者修改命令就立刻强制写入磁盘
everysec 每秒强制写入磁盘一次
no 是否写入磁盘完全依赖操作系统

日志追加的方式可以有效降低数据丢失的风险,同时也会带来别的问题,即持久化文件 appendonly.aof 占内存会不断加大。比如调用incr number命令100次,文件就会保存100次incr 命令,实际上恢复数据只需要set num 100就可以,99个指令都是多余的。

服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错,那么Redis在重启时会拒绝载入这个 AOF 文件,从而确保数据的一致性不会被破坏。

当发生这种情况时,可以用以下方法来修复出错的 AOF 文件:

  1. 为现有的AOF文件创建一个备份。
  2. 使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复。
    $ redis-check-aof --fix
  3. (可选)使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。
  4. 重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。

AOF的运作方式:

  1. Redis 执行 fork() ,现在同时拥有父进程和子进程。
  2. 子进程开始将新 AOF 文件的内容写入到临时文件。
  3. 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾:这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
  4. 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
  5. Redis原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。

Redis也提供了压缩日志的命令--bgrewriteaof。Redis收到这条命令时,就会用类似内存快照的方式将内存的数据以命令的方式保存到临时文件中,然后替换日志文件。

资料参考:http://doc.redisfans.com/topic/persistence.html

转载于:https://my.oschina.net/OSrainn/blog/730730

redis学习篇(十)-----高级特性之持久化处理相关推荐

  1. redis学习篇(九)-----高级特性之事务处理

    2019独角兽企业重金招聘Python工程师标准>>> redis目前对事务的处理比较简单,只能保证一个客户端连接发起事务中的命令可以连续的执行,而中间不被插入其他客户端连接的命令. ...

  2. Redis 宝典 | 基础、高级特性与性能调优

    转载:Redis 宝典 | 基础.高级特性与性能调优 本文由 DevOpsDays 本文由简书作者kelgon供稿,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长. 作者:kelgon 链接: ...

  3. Redis基础用法、高级特性与性能调优以及缓存穿透等分析

    目录 一.Redis介绍 二.Redis数据结构及常用的命令 三.Redis持久化策略选择 四.内存管理与数据淘汰机制 五.Redis过期策略及实现原理 1  说明 2  设置过期时间 3  三种过期 ...

  4. Python学习笔记:高级特性

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Spring框架学习[IoC容器高级特性]

    1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...

  6. Java学习之java高级特性

    From:https://blog.csdn.net/w252064/article/details/79923999 [Java高级特性详解]:https://blog.csdn.net/qq_37 ...

  7. 廖雪峰python学习笔记之高级特性

    写在前面 寒假时本科舍友的一句话点醒梦中人-你的python基础还没弄明白吧!猛地一想好像确实如此,还停留在随插随用的程度,并且对于迭代器,函数式编程等等,没有深刻理解,所以项目做起来也是空中楼阁,所 ...

  8. Redis学习笔记(八):RDB持久化

    目录 简介 RDB持久化 1. RDB文件如何创建 1.1 save, bgsave命令 1.2 定期触发 1.2.1 保存条件怎么设置 1.2.2 实现细节 2. RDB文件如何加载 3. RDB文 ...

  9. Java学习篇十——关于方法的定义和使用

    写在前面:本人是借助两本参考书自学的,其中部分例子和语句均是来自参考书.第一本:<Java 编程指南>,[美] Budi Kurniawan 著,闫斌 贺莲 译.第二本:<第一行代码 ...

最新文章

  1. 百度发布智能小程序:“开放+AI”是最大特色
  2. python 读取grib \grib2
  3. Jsp页面中常用的EL表达式
  4. (Android第一行代码)活动的启动模式
  5. hadoop API之:文件操作
  6. 计算机操作员理论知识试题,计算机操作员理论考试试题.doc
  7. 数字图像处理第三版(冈萨雷斯)笔记,2020
  8. ERP原理与应用教程-第一章
  9. TS:虚机ipv6网络不通问题-2022.5.16(已解决-博客分享)
  10. 移动互联网之路——Axure RP 8.0网站与APP原型设计从入门到精通
  11. excel等额本息计算房贷公式
  12. 2016(第三届)智能家居世界大会
  13. python判断火车票座位是否靠窗_Python查询火车票(一)
  14. oracle表空间权限赋予,Oracle 创建用户、表空间以及授予权限
  15. [Python模块]根据姓名笔画数排序
  16. 2021年淘宝双11跨店满减如何使用?
  17. js禁止鼠标滑轮_JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
  18. 字节跳动2018.11校招测试岗笔试(回忆版)
  19. C++语言程序设计——知识点复盘(第四章 类与对象)
  20. Win10 64位下GPU版本MXNet+Tensorflow 1.3.0的安装

热门文章

  1. 团队项目开发编码规范之一:概述
  2. java调度:(一)几种任务调度的 Java 实现方法与比较
  3. linux twiki 添加权限,Linux安装TWiki
  4. 安装Nacos Server
  5. RabbitMQ direct交换机
  6. Redis中的Cluster高可用和主从切换原理
  7. http响应协议分析
  8. flume高可用-failover-配置文件编写
  9. 使用RabbitMQ实现松耦合设计
  10. oracle xdb插件报错,注册XML Schema到ORACLE XDB并对XML进行验证