天天看点

redis 面试知识点总结1 redis持久化机制2 总结

1 redis持久化机制

由于redis基于内存运行,如果断电关闭,内存中的数据就不再存在,数据丢失。但是redis支持关机再启动数据依然存在,这就是redis持久化。实则是在某一时刻把redis中的数据写入了磁盘中的持久化文件中。

两种持久化方式

1.1 RDB

RDB是Redis用来进行持久化的一种方式(默认开启的是RDB持久化),是把当前内存中的数据集快照写入磁盘(数据库中所有键值对数据),恢复时是将快照文件直接读到内存里。

原理是:redis创建一个与当前进程数据(变量、环境变量、计数器)完全相同的子进程实现持久化,主进程没有IO操作,保证高性能。子进程将数据写到临时文件中,持久化后,使用临时文件代替之前被持久化好的的文件。

由于redis是单线程的,无法接收来自客服端的大量set请求。fork出新的进程既保证实现持久化,又实现了为向redis发送数据的请求提供响应。

启动redis后,在redis目录下可以看到: 这个dump文件(内存数据的备份)就是rdb持久化生成的临时文件。

其中可以vim

redis.congf

这个配置文件,查找dir会发现 dir ./ 也就是 dump.rdb会生成到 dir后面的路径。

而且还要保证redis启动时的路径中包含dump.rdb文件,这如果存在就会加载这个dump,否则就是empty list。

同样可以在redis.conf中,查找dbfilename,修改后面的默认文件名,以使用自定义的dump.rdb文件。

redis 面试知识点总结1 redis持久化机制2 总结

下面这个图就是持久化开始和结束的时候,对上面的验证,其中可以看到fork出的新进程以及产生的temp文件。

并且在持久化之后,发现dump5000000.rdb文件的时间不一样了,也就是确实使用临时的rdb文件进行了更新。

redis 面试知识点总结1 redis持久化机制2 总结

1.1.1 单线程阻塞

RDB持久化命令bgsave和save,save命令使用的是主进程进行持久化。

save命令阻塞:主进程会先去持久化操作,然后再接收客户端的数据。这样如果大量的set命令,性能 非常低。

1.1.2 触发RDB持久化机制

  • shutdown时,如果没有开启aof,就会fork子进程,触发持久化。(kill不会触发,或者是意外宕机也不会触发)
  • 配置文件中包含了默认触发RDB持久化的机制,redis.conf 注释文件截图:(关键字:save,redis调优就是调整save后面的参数)
    redis 面试知识点总结1 redis持久化机制2 总结
  • 执行命令 save或者是bgsave,bgsave是fork出子进程持久化,而save是只会保存,其他都阻塞。
  • 响应客户端的请求,执行flushall命令。

1.1.3 RDB持久化关闭

将这三行都注释掉或者使用 save " "。

但是redis有主从集群(复制),使用了主从集群模式无法关闭RDB持久化,因为主机把rdb持久化文件发送给从机,从机会复制主机的数据。

redis 面试知识点总结1 redis持久化机制2 总结

1.2 aof

aof对比RDB的优势在于:

  • aof比RDB持久化保证数据丢失更少。

    由于RDB的机制,如果某一个数据的传入后,服务端意外宕机,那么这个没有触发持久化机制的数据就会丢失。根据RDB的快照配置,宕机会丢失一段时间的数据。而aof就可以解决这个问题。

    aof丢失数据的最高阈值是2s,也就是2s内的数据都可以保证不会丢失。因为aof默认配置是每1s执行一次备份。

aof持久化保存的是命令,这些命令的保存不同于RDB保存的内存数据,这些命令字符串保存在

append.aof

文件中。

redis 面试知识点总结1 redis持久化机制2 总结

1.2.1 aof保存的是协议

如图,打开rof持久化,并且添加数据。

redis 面试知识点总结1 redis持久化机制2 总结

这样会多出一个appendonly.rof文件,我们打开这个文件看看内部存储的是什么内容。

redis 面试知识点总结1 redis持久化机制2 总结

会发现这个rof文件中记录了以下内容:

redis 面试知识点总结1 redis持久化机制2 总结

保存的内容就是redis协议,其中select下面的0,代表了默认保存到redis16个库中的默认0号库,*2代表下面有两条命令,分别是select 0 和 set k1 v1,$6代表了select的长度是6,下面的$同理。

1.2.2 触发机制(配置文件)

  • no:本操作系统调用,等操作系统进行数据缓存,同步到磁盘。优点是快。
  • always:同步持久化,每次发生数据变更,都会立即记录到磁盘中。优点是安全,但是慢,性能差。
  • everysec:每一秒同步一次。默认值,很快。

1.2.3 aof重写

当aof文件中当数据增长到一定数量(比如一个set k1 v1,之后删除 del k1,这两个命令没有必要记录到aof文件中,包括多个对相同key的incr命令,同样可以通过重写,直接set,实现瘦身),redis调用bgrewriterof对日志文件进行重写,就是给append文件瘦身。

当aof文件大小大于配置项时,开启自动重写。

auto-aof-rewrite-min-size 64MB

当aof文件大小的增长率大于配置项时,开启自动重写。(指超过原aof文件的100%)

auto-aof-rewrite-percentage 100

1.2.4 aof混合持久化

开启混合持久化

redis4.0版本的混合持久化默认是关闭的,通过

aof-use-rdb-preamble

配置参数控制,yes为开启,no为关闭。

混合持久化是通过bgrewriteaof完成的,不同的是当开启混合持久化,fork出的子进程会先将共享的内存副本全量的以RDB格式写入aof文件中,然后再将重写缓冲区的增量命令以AOF方式写入aof文件中,写入完成后通知主进程更新统计信息,并将新的含有RDB格式和AOF格式的aof文件替换旧的aif文件。(新的aof文件前半段是RDB格式的全量数据,后半段是AOF格式的增量数据)

优点:混合持久化结合了RDB和aof的优点,加载速度快,结合AOF保证增量的数据以AOF方式保存,减少数据丢失。

缺点:兼容性差,开启了混合持久化,4.0版本之前不识别aof文件,并且RDB格式阅读性差。

2 总结

  • redis有RDB持久化,AOF的出现优化了数据丢失的问题,RDB可能会丢失最后一次快照后的数据,而AOF丢失不会超过2s的数据。
  • 如果RDB和AOF同时开启,优先使用AOF机制。
  • RDB性能消耗低,数据丢失会超过AOF,速度快,适合大规模的数据恢复,数据完整性和一致性低。

继续阅读