一. 数据持久化
1. 含义
Redis 提供了 RDB 和 AOF 两种持久化方式,默认开启的是RDB,如果需要AOF,需要手动修改配置文件进行开启。
RDB:是一种对Redis存在内存中的数据周期性的持久化机制,将内存中的数据以快照的形式硬盘,实质上是fork了一个子进程在执行数据存储,采用的是二进制压缩的存储模式。
如图:
AOF:是以文本日志的形式记录Redis的每一个写入、删除请求(查询请求不处理),它是以追加的方式(append-only)写入,没有磁盘寻址的开销,所以写入速度非常快(类似mysql的binlog)。
如图:
2. 优缺点对比
(1). RDB优点
生成多个数据文件,每个文件代表某一时刻redis的数据,而且RDB是fork一个子进程做持久化,所以RDB对Redis性能影响非常小,而且他在数据恢复的时候也比AOF快。
(2). RDB缺点
A. RDB通常是每隔一段时间查看key变化数量从而决定是否持久化一次数据,比如5min分钟1次吧,如果这期间宕机或断电,丢失的就是这5min的数据了,而AOF最多丢失一秒。
B. RDB如果生成的快照文件非常大,客户端会卡顿 几毫秒或者几秒,恰逢当时是高并发期间,绝壁出问题!
(3). AOF优点
A. AOF通常设置1s通过后台线程去追加一次,所以最多丢失1s数据,数据的完整性比RDB要高。
B. AOF是appendonly追加的方式,少了磁盘寻址的开销,所以写入性能很高,文件也不易损坏。
C. 可以对数据误删进行紧急恢复。
(4). AOF缺点
A. 同样的数据,AOF文件要比RDB文件大的多。
B. 开启AOF存储后,整个Redis的QPS要下降,但依旧比关系型数据库要高。
3. 适用场景及如何选择
RDB适合做冷备,AOF适合做热备。
在生产环境中,通常是冷备和热备一起上,RDB中bgsave做全量持久化,AOF做增量持久化,在redis重启的时候,使用rdb持久化的文件重新构建内存,再使用aof恢复最近操作数据,从而实现完整的服务到重启之前的状态。
(单独用RDB你会丢失很多数据,你单独用AOF,你数据恢复没RDB来的快,所以在生产环境中,第一时间用RDB恢复,然后AOF做数据补全,冷备热备一起上,才是互联网时代一个高健壮性系统的王道。)
4. rdb持久化中save和bgsave的区别
save和 bgsave 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:
(1). save 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止,在主进程阻塞期间,服务器不能处理客户端的任何请求。
(2). bgsave 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成,Redis 服务器在 bgsave 执行期间仍然可以继续处理客户端的请求。
(bgsave的本质就是 fork 和 cow,fork是指redis通过创建子进程来进行bgsave操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写进的页面数据会逐渐和子进程分离开来)
总结:save是阻塞方式的;bgsave是非阻塞方式的。
5. 相关代码配置
#一. RDB存储
#1. 下面配置为默认配置,默认就是开启的,在一定的间隔时间中,检测key的变化情况,然后持久化数据
save 900 1 #900s后至少1个key发生变化则进行存储
save 300 10 #300s后至少10个key发生变化则进行存储
save 60 10000 #60s后至少10000个key发生变化则进行存储
#2. rdb文件的存储路径(默认当前目录下,文件名为dump.rdb)
dbfilename dump.rdb
dir ./
#二. AOF存储
#1.默认是关闭的,日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据,启用的话通常使用每隔一秒持久化一次的策略
appendonly no(默认no) --> appendonly yes (开启aof)
# appendfsync always #每一次操作都进行持久化
appendfsync everysec #每隔一秒进行一次持久化
# appendfsync no # 不进行持久化
#2. aof文件路径 (默认为当前目录下,文件名为 appendonly.aof)
appendfilename "appendonly.aof"
dir ./ (同上)
#3. 控制触发自动重写机制频率
# auto-aof-rewrite-min-size 64mb //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
# auto-aof-rewrite-percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次触发重写
#三. 混合持久化
#1. 开启混合持久化配置 (5.0版本默认就是yes)
aof-use-rdb-preamble yes
#2. rdb和aof自身的配置也都需要开启
6. aof持久化文件详解
(1). aof文件长什么样?
通常我们配置aof持久化为everysec,即为每秒写一次,这里我们先把混合持久化关掉 【aof-use-rdb-preamble no】<