1.前言概述
众所周知,Redis是一款C语言编写,类似键值对Key-Value的NoSQL非关系型数据库。它的工作区域是我们计算机的内存中,那么它也面临着和内存一样的困扰,断电即消失,不能长久存储。针对这个问题,Redis提出了两套解决方案。下面我们就来介绍这两种解决方案。
2.持久化方式
2.1 RDB
Redis Database
内存数据镜像,把内存所有数据拍一个快照,把数据全部保存到一个二进制的磁盘文件:dump.rdb 中。这个就可以理解成我们常说的备份,Redis会在一定时间内去备份所有的缓存中的数据,这个时间我们可以通过redis.conf中添加配置,也就是说,当多少秒内有多少条数据改动时才会去触发一次Redis持久化操作。例如:
-save 3600 1:1小时内,有一条数据改动
-save 300 100:5分钟内,有100条数据改动
-save 60 10000:1分钟,有10000条数据改动
默认不自动保存内存快照,需要手动调用:
- save 同步保存
- bgsave 异步保存
Redis借助了linux系统的写时复制(Copy-On-Write)技术,在生成快照的同时,仍然可以接收命令处理数据。写时复制:
- 保存快照时,先写到临时文件,完成后删除dump.rdb,把临时文件盖明成 dump.rdb
- 临时文件写入失败数据损坏,也不会影响dump.rdb
dump.rdb文件修复:
redis-check-rdb dump.rdb
RDB的优缺点:
优点: 恢复数据速度快
缺点: - 可能丢失少量新数据 - 持久化时存储数据效率低
2.2 AOF
AOF - Append Only File
AOF的持久化方式就是记录所有Redis数据操作指令,每执行一条增删改的命令,都会实时地追加到 aof 日志文件。
默认不开启AOF,需要在配置文件中开启AOF:
appendonly yes #默认是no
时间方面的设置
appendfsync参数,三个取值:
always: 每个事件周期都同步刷新一次
everysec: 每一秒都同步刷新一次
no: 我只管写,让操作系统自己决定什么时候真正写入吧
AOF的优缺点:
- 优点 - 持久化效率高 - 不会丢失数据
- 缺点 - 恢复数据时效率低 - aof中记录的所有命令进行重放,效率低
随着运行时间变长,AOF这个备份文件会越来越大,非常占空间,所以就引出了重写的机制。
rewrite压缩:
对文件中记录的指令,能合并的指令合并成一条执行。
- 文件大小达到min-size时触发,每增长100%时再次触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
3. 官方建议使用 RDB+AOF 混合模式
存储:
- RDB完整存储内存数据
- RDB之后的增量数据,使用AOF来记录
恢复:
- 从RDB恢复绝大多数数据
- 重放AOF,恢复少量增量数据