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,恢复少量增量数据?
?
?
|