经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
redis 是如何做持久化的
来源:cnblogs  作者:LastSun  时间:2019/7/10 11:13:24  对本文有异议

Redis 是一个键值对数据库服务器。基于内存存储数据,它常被用做缓存数据库,用来替代 memcached。官网:https://redis.io/

什么是持久化?

持久化,指将数据存储到可永久保存的设备中。
例如,将内存中的数据存储到可永久保存的硬盘中。

为什么需要持久化?

  1. Redis 基于内存存储,内存掉电后数据会丢失
  2. 内存比硬盘贵得多,所以需要将一些不能丢失的数据持久化到硬盘上

甚至,一些特别重要的数据,是需要存到 MySQL 的。
Redis 本身有持久化,为什么还要写进 mysql 呢?:https://www.v2ex.com/t/219551

如何做持久化?

Redis 提供了四种持久化方式:

  1. RDB(Redis database|Snapshoting)
  2. AOF(Append-Only file)
  3. VM(虚拟内存)被淘汰了
  4. Diskstore 不了解

这次主要说的是 RDB 和 AOF 两种持久化方式。

RDB 持久化

RDB:Redis database 的简称。一看这个,你就应该能猜到,这是 Redis 的默认持久化方式。

RDB 中持久化生成的是一个经过压缩的二进制文件。

RDB 持久化时机:

  1. 在客户端执行 SAVE 或者 BGSAVE
  2. 根据配置规则自动快照(稍后会讲到)
  3. 执行 FLUSHALL 命令
  4. 执行复制(replication)

RDB 持久化步骤:

  1. fork 复制出一个父进程的副本子进程
  2. 子进程将内存中的数据写入到硬盘中的临时文件
  3. 将临时文件替换旧的 rdb 文件

图片

自动间隔保存(配置规则):

  1. save 900 1 # 每900秒检查一次,如果有1条数据修改了,那么执行 rdb
  2. save 300 10 # 每300秒检查一次,如果有10条数据修改了,那么执行 rdb
  3. save 60 10000 # 每60秒检查一次,如果有10000条数据修改了,那么执行 rdb

RDB 文件还原

服务器启动时,会直接载入 RDB 文件。
但是如果 AOF 文件存在,则会载入 AOF 文件。AOF 文件载入过程会在后文中描述

AOF 持久化

AOF 是 Append Only File 的简称。

AOF 通过保存客户端传过来的写命令来记录数据库的状态。
如:

  1. $3(后面是 \r\n
  2. SET
  3. $3
  4. msg
  5. $1
  6. 5
  7. $3
  8. SET
  9. $3
  10. msg
  11. $1
  12. 3

AOF 持久化的时机

需要在配置文件中加入:

  1. appendonly yes

AOF 持久化的步骤

主进程进行如文章末尾所示的三个步骤:

  1. 命令追加
  2. 文件写入
  3. 文件同步

AOF 重写的时机

  1. 配置:
  1. # 当前 AOF 文件超过上次重写时的 AOF 文件大小的百分之多少时再次进行重写
  2. # 如果之前没有冲写过,则以启动时的 AOF 文件大小为依据。
  3. auto-aof-rewrite-percentage 100
  4. # 允许重写的最小值
  5. auto-aof-rewrite-min-size 64mb
  1. 主动执行 BGREWRITEAOF 命令触发 AOF 重写。

AOF 重写步骤

如果是在客户端直接执行 REWRITEAOF ,会阻塞服务,直到重写完成,将新的 AOF 文件覆盖旧的文件。这种方式一般不会考虑。

BGREWRITEAOF 命令的执行过程如文末图片所示:

  1. 父进程写入 AOF 缓冲区和 AOF 重写缓冲区
  2. 子进程执行 AOF 重写,完成之后发送信号给父进程
  3. 父进程收到信号将 AOF 重写缓冲区的内容写入到新的 AOF 文件中,并且覆盖原有的 AOF 文件

AOF 重写是将多条命令用一条命令代替。
如上面代码所示,存储一个 msg 使用了两条命令。经过 AOF 文件重写之后,就会变成如下所示,大大减少了使用的存储空间:

  1. $3
  2. SET
  3. $3
  4. msg
  5. $1

AOF 文件还原

AOF 文件还原的步骤如下:

  1. 创建一个伪客户端(fake client)
  2. 从 AOF 文件中分析并读取一条写命令
  3. 使用伪客户端执行写命令
  4. 一直重复步骤 2 和 3

AOF 写入与重写过程图:

图片

原文链接:http://www.cnblogs.com/wdy1184/p/11156177.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号