Rdis的读写都是在内存中进行,因此redis的性能很高。 持久化能够有效地避免因进程退出而形成数据丢失问题,下次重启的时候利用以前持久化文件能够实现数据恢复。redis
Redis 持久化拥有如下三种方式:算法
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发缓存
记录全部的操做命令,并以文本的形式追加到文件中;安全
Redis 4.0 以后新增的方式,混合持久化是结合了 RDB 和 AOF 的优势,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操做命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险。服务器
以上三种持久化方案,每一种都有特定的使用场景,具体的咱们能够根据本身的需求自行选择。app
RDB(Redis DataBase)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的过程
。工具
RDB的持久化方式有两种:性能
一种是手动触发,一种是自动触发
操作系统
手动触发Redis提供了两个命令 :save
和 bgsave
。线程
save
手动触发会阻塞主线程
在客户端执行save
命令时候,就会触发持久化,但也会使得Redis主线程阻塞,必须等到RDB持久化完成以后,才会相应客户端的命令,线上环境不建议使用
。
下图演示使用save
命令
启动Redis (默认配置是rdb持久化方式),rdb文件时间。
而后使用save
持久化数据
而后查看持久化后rdb文件的时间
说明手动持久化文件成功
bgsave
不会阻塞主线程
使用bgsave
命令时候,Redis进程执行fork操做建立子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,通常时间很短,基本不会发生阻塞,与save
命令相比显然bgsave
更适合咱们持久化数据。
下图表示开始自动持久化数据
如何自动触发 RDB 持久化?
在redis.conf文件中有这么一个配置
什么意思呢?
save m n
表示m秒内数据集存在n次修改 时,自动触发bgsave
命令。
save 900 1 则代表在 900 秒内,至少有一个键发生改变,就会触发 RDB 持久化。 save 300 10 则代表在 300 秒内,至少有10个键发生改变,就会触发 RDB 持久化。 save 60 10000 则代表在 60 秒内,至少有10000个键发生改变,就会触发 RDB 持久化。
知足以上任意一个条件,Redis 就会自动触发bgsvae
命令进行持久化工做。
注意:flushall
是把内存中的数据清空,持久化会把原先已经持久化的 .rdb 文件清空。
Redis主从复制时,当从节点执行全量复制操做时,主节点会执行 bgsave 命令,并将 RDB 文件发送给从节点,该过程会自动触发 Redis 持久化。
RDB配置说明
# RDB 保存的条件 save 900 1 save 300 10 save 60 10000 # bgsave 失败以后,是否中止持久化数据到磁盘,yes 表示中止持久化,no 表示忽略错误继续写文件。 stop-writes-on-bgsave-error yes # RDB 文件压缩 # Redis 会采用 LZF 算法进行压缩。若是不想消耗 CPU 性能来进行文件压缩的话,能够设置为关闭此功能,# 这样的缺点是须要更多的磁盘空间来保存文件。 rdbcompression yes # 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,若是在启动是检查发现损坏,则中止启动。 rdbchecksum yes # RDB 文件名 dbfilename dump.rdb # RDB 文件目录 dir ./
优势
缺点
save ""
AOF(append only file)持久化:以独立日志的方式记录每次写命令, 重启时再从新执行AOF文件中的命令达到恢复数据的目的。AOF的主要做用 是解决了数据持久化的实时性,目前已是Redis持久化的主流方式
AOF的工做流程操做
命令写入 (append)、文件同步(sync)、文件重写(rewrite)、重启加载 (load)。
默认是 no
表示关闭 ,yes
表示开启。
持久化配置
always:每条 Redis 操做命令都会写入磁盘,最多丢失一条数据,但会使得Redis的性能下降,但数据几乎是全的,基本不会存在丢失数据问题。
everysec:每秒钟写入一次磁盘,最多丢失一秒的数据,对存取数据和性能折中,能够知足大部分使用场景。
no:不设置写入磁盘的规则,根据当前操做系统来决定什么时候写入磁盘,通常不采用这种设置。
手动触发
使用bgrewriteaof
命令能够手动触发aof持久化
随着时间的推移和数据量变大,aof一直在进行持久化,磁盘日志愈来愈大,redis重启速度愈来愈慢,针对这个问题,Redis提供了AOF重写功能。
Redis中的数据是有必定限量的,最多不超过物理内存大小,不可能说Redis中的数据无限增加,致使aof也无限增加,到必定的时候Redis就会采用缓存淘汰算法LRU自动将以部分数据从内存中给清除。
AOF 重写配置
AOF 重写流程
AOF 是存放每条写命令的,因此会不断变大,达到必定的时候,AOF作rewrite操做,会从新生成一个新的AOF文件。
优缺点
AOF 优势
AOF 持久化保存的数据更加完整,AOF 提供了三种保存策略:每次操做保存、每秒钟保存一次、跟随系统的持久化策略保存,其中每秒保存一次,从数据的安全性和性能两方面考虑是一个折中的选择,也是 AOF 默认的策略,即便发生了意外状况,最多只会丢失 1s 钟的数据;
AOF 采用的是命令追加的写入方式,因此不会出现文件损坏的问题,即便因为某些意外缘由,致使了最后操做的持久化数据写入了一半,也能够经过 redis-check-aof 工具轻松的修复;
AOF 持久化文件,很是容易理解和解析,它是把全部 Redis 键值操做命令,以文件的方式存入了磁盘。即便不当心使用 flushall 命令删除了全部键值信息,只要使用 AOF 文件,删除最后的 flushall 命令,重启 Redis 便可恢复以前误删的数据。
AOF 缺点
对于相同的数据集来讲,AOF 文件要大于 RDB 文件;
在 Redis 负载比较高的状况下,RDB 比 AOF 性能更好;
RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,所以从理论上说,RDB 比 AOF 更健壮。
RDB和AOF持久化各有优缺点,RDB会致使一段时间内的数据丢失,AOF文件会愈来愈大,会影响Redis的启动速度,为了同时兼顾RDB,AOF的优势,Redis在4.0版本以后提供了混合持久化方式。
混合持久化
AOF 重写时会把 Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,以后的数据再以 AOF 的格式化追加的文件的末尾,以下图所示。
开启混合
将no
改成yes
便可
混合持久化优缺点
优势
混合持久化结合了 RDB 和 AOF 持久化的优势,开头为 RDB 的格式,使得 Redis 能够更快的启动,同时结合 AOF 的优势,有减低了大量数据丢失的风险。
缺点:
AOF 文件中添加了 RDB 格式的内容,会使得 AOF 文件的可读性会不好,不容易阅读; 若是开启混合持久化,就必须使用 Redis 4.0 以及以后版本
。
使用混合持久化的时候能够根据自身业务选择关闭RDB或者AOF,或者关闭持久化。
关注我
长按二维码
若是你喜欢这篇文章,喜欢,在看,转发。