Redis持久化RDB和AOF

Redis是一种高级key-value数据库。数据能够持久化,并且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。因此Redis也能够被当作是一个数据结构服务器。数据库

Redis为了保证效率,数据缓存在内存中,Redis 会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,以保证数据的持久化。缓存

Redis是一个支持持久化的内存数据库,能够将内存中的数据同步到磁盘保证持久化。bash

Redis的持久化策略:2种服务器

  • RDB:快照形式是直接把内存中的数据保存到一个 dump 文件中,定时保存,保存策略。
  • AOF:把全部的对Redis的服务器进行修改的命令都存到一个文件里,命令的集合。 Redis默认是快照RDB的持久化方式

当 Redis 重启时,它会优先使用 AOF 文件来还原数据集,由于 AOF 文件保存的数据集一般比 RDB 文件所保存的数据集更完整。你甚至能够关闭持久化功能,让数据只在服务器运行时存。数据结构

RDB 持久化

默认 Redis 是会以快照 “RDB” 的形式将数据持久化到磁盘的,一个二进 制文件,dump.rdbapp

工做原理简单介绍一下:当 Redis 须要作持久化时,Redis 会 fork 一个子进程,子进程将数据写到磁盘上一个临时 RDB 文件中。当子进程完成写临时文件后,将原来的 RDB 替换掉,这样的好处就是能够 copy-on-write。异步

Redis默认状况下,是快照 RDB 的持久化方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名是 dump.rdb 。固然咱们也能够手动执行 save 或者 bgsave(异步)作快照。函数

Redis.conf配置 :默认是以下配置性能

save 900 1 
save 300 10
save 60 10000
复制代码
  • 900秒以内,若是超过1个key被修改,则发起快照保存;
  • 300秒内,若是超过10个key被修改,则发起快照保存;
  • 1分钟以内,若是1万个key被修改,则发起快照保存;

RDB 的优势:

这种文件很是适合用于进行备份: 好比说,你能够在最近的 24 小时内,每小时备份一次 RDB 文件,而且在每月的每一天,也备份一个 RDB 文件。 这样的话,即便赶上问题,也能够随时将数据集还原到不一样的版本。RDB 很是适用于灾难恢复(disaster recovery)。spa

RDB 的缺点:

若是你须要尽可能避免在服务器故障时丢失数据,那么 RDB 不适合你。 虽然 Redis 容许你设置不一样的保存点(save point)来控制保存 RDB 文件的频率, 可是, 由于RDB 文件须要保存整个数据集的状态, 因此它并非一个轻松的操做。 所以你可能会至少 5 分钟才保存一次 RDB 文件。 在这种状况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。

AOF 持久化

使用 AOF 作持久化,每个写命令都经过write函数追加到 appendonly.aof 中,配置方式:启动 AOF 持久化的方式

Redis.conf配置

appendfsync yes   
appendfsync always     #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec   #每秒钟同步一次,该策略为AOF的缺省策略。
复制代码

AOF 就能够作到全程持久化,只须要在配置文件中开启(默认是no),appendonly yes开启 AOF 以后,Redis 每执行一个修改数据的命令,都会把它添加到 AOF 文件中,当 Redis 重启时,将会读取 AOF 文件进行“重放”以恢复到 Redis 关闭前的最后时刻。

AOF 的优势

使用 AOF 持久化会让 Redis 变得很是耐久(much more durable):你能够设置不一样的 fsync 策略,好比无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然能够保持良好的性能,而且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,因此主线程能够继续努力地处理命令请求)。

AOF 的缺点

对于相同的数据集来讲,AOF 文件的体积一般要大于 RDB 文件的体积。根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB。 在通常状况下, 每秒 fsync 的性能依然很是高, 而关闭 fsync 可让 AOF 的速度和 RDB 同样快, 即便在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 能够提供更有保证的最大延迟时间(latency)。

两者的区别

  • RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操做过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换以前的文件,用二进制压缩存储。

  • AOF持久化以日志的形式记录服务器所处理的每个写、删除操做,查询操做不会记录,以文本的方式记录,能够打开文件看到详细的操做记录。

RDB 和 AOF ,我应该用哪个?

若是你很是关心你的数据,但仍然能够承受数分钟之内的数据丢失, 那么你能够只使用 RDB 持久。 AOF 将 Redis 执行的每一条命令追加到磁盘中,处理巨大的写入会下降 Redis 的性能,不知道你是否能够接受。 数据库备份和灾难恢复:定时生成 RDB 快照(snapshot)很是便于进行数据库备份, 而且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快。

Redis 支持同时开启 RDB 和 AOF,系统重启后,Redis 会优先使用 AOF 来恢复数据,这样丢失的数据会最少。

相关文章
相关标签/搜索