Redis持久化

1、 文档介绍redis

     redis做为一个内存数据库,读写快,效率高,可是也会有宕机丢失数据的风险,因而就须要持久化操数据库

     Q&A:      缓存

     数据量大于内存大小时应该怎么作?安全

     增长内存or采用内存淘汰策略orRedis集群
服务器

     持久化会辅助扩大Redis的存储空间么?
工具

     不会,持久化的主要做用是数据备份,保证数据不会因进程退出而丢失优化

     (在dump的基础上开始准备Restore的实现,dump操做的第一步就是将aof文件内的记录同步到redis内,故了解一下aof文件)spa

2、RDB与AOF持久化的原理操作系统

2.1 RDB日志

RDB能够认为是Snapshot文件,当恢复时,经过加载RDB文件。把数据从磁盘加载读取到Redis中。

RDB产生:(考虑快照时的操做)

  • SAVE方式:阻塞请求
  • BGSAVE:fork一个子进程,子进程将快照写到一个临时的RDB文件,写完以后替换旧的RDB文件

RDB的加载:

Redis持久化能够禁用,此时数据仅存在于服务器的运行时间内

Redis持久化也能够共存,当同时存在的时候,Redis重启是会先加载AOF文件

2.2 AOF

AOF能够认为是日志文件,Append only File,每次对数据的变动或者操做都会先记录打AOF内,当服务启动的时候就会先读取这些文件,从新执行一遍来恢复原始数据。

AOF提供三种同步(写aof文件与操做数据的同步)的方式:

  • always:每次操做记录都同步到磁盘上,最低效,最安全
  • everysec:每秒执行一次将操做记录同步到磁盘。默认
  • no:不自动执行同步,让操做系统将缓存数据写到硬盘上,不可靠,最快

AOF文件的格式与解析:

  • *,表示命令的参数个数,例如上面的set a 1 是三个 所以为*3
  • ¥,表示参数的字节数,例如a这个参数是一个字节,所以为$1
  • 无符号,表示是参数数据

AOF优化:(重写)

当对一个如今为0的值执行100遍“a++”操做的话,若是每一次都记录一个操做再同步,很是浪费资源与时间,而且文件也会变大,重写即将这一百条数据写成set a 100,减小文件大小,而且提升载入速率

3、RDB与AOF的优缺点

3.1 RDB

优势:

  • RDB是某一个时间点的备份,是一个紧凑的单文件,多用于数据备份。能够按每小时或每日来备份,方便从不一样的版本恢复
  • 单文件方便远程传输便于故障恢复
  • RDB能够Fork子进程进行持久化,使得Redis能够更好的处理用户的请求
  • 在数据量大的状况下,RDB相比较于AOF加载的更快

缺点:

  • 若是RDB保存不及时会致使数据丢失
  • RDB常常须要Fork子进程去执行,fork操做十分耗费CPU,而且是全量的,AOF的Fork是增量的,而且AOF是可控的

3.2 AOF

优势:

  • AOF能够设置 彻底不一样步、每秒同步、每次操做同,默认是每秒同步。由于AOF是操做指令的追加,因此能够频繁的大量的同步。
  • AOF文件是一个值追加日志的文件,即便服务宕机为写入完整的命令,也能够经过redis-check-aof工具修复这些问题。
  • 若是AOF文件过大,Redis会在后台自动地重写AOF文件。重写后会使AOF文件压缩到最小所需的指令集。
  • AOF文件是有序保存数据库的全部写入操做,易读,易分析。即便若是不当心误操做数据库,也很容易找出错误指令,恢复到某个数据节点。例如不当心FLUSHALL,能够很是容易恢复到执行命令以前。

缺点:

  • 相同数据量下,AOF的文件一般体积会比RDB大。由于AOF是存指令的,而RDB是全部指令的结果快照。但AOF在日志重写后会压缩一些空间。
  • 在大量写入和载入的时候,AOF的效率会比RDB低。由于大量写入,AOF会执行更多的保存命令,载入的时候也须要大量的重执行命令来获得最后的结果。RDB对此更有优点。

3、取舍

 

    通常来讲,不考虑硬盘大小,最安全的作法是RDB与AOF同时使用,即便AOF损坏没法修复,还能够用RDB来恢复数据。

 

    若是Redis的数据在你的服务中并非必要的数据,例如只是当简单的缓存,没有缓存也不会形成缓存雪崩。说明数据的安全可靠性并非首要考虑范围内,那么单独只使用RDB就能够了。

 

    不推荐单独使用AOF,由于AOF对于数据的恢复载入来讲,比RDB慢。

相关文章
相关标签/搜索