什么是redis持久化?
Redis持久化是指将Redis中的数据写入磁盘,(因为redis的数据是存在内存中的)以便在Redis服务器重启时可以重新加载数据。这样可以确保数据不会因为服务器重启而丢失。
Redis有两种主要的持久化方式:
-
RDB持久化:RDB持久化通过将Redis在内存中的数据定期保存到磁盘上的一个快照文件中。管理员可以根据需求设置保存快照的频率。这种方式适用于备份数据或者在服务器重启时快速恢复数据。但是,由于数据是定期保存的,如果Redis意外宕机,可能会丢失最后一次持久化后的数据。
-
AOF持久化:AOF(Append Only File)持久化则是将Redis的操作日志追加到文件末尾。这种方式下,Redis会将每次写操作追加到文件中,以此来记录数据变化。在Redis重启时,通过重新执行AOF文件中的命令,可以恢复数据。AOF持久化相对于RDB持久化更加安全,因为它可以提供更好的数据持久性保证,但是会占用更多的磁盘空间。
简单理解:RDB是保存了当前数据库中的内容,重启的时候,根据这里面的内容恢复;AOF是根据操作记录来恢复到数据库的最新状态
AOF和RDBD都是文件类型,下面简单列举了各自的文件内容,便于理解。
RDB文件示例:
REDIS0009�_db2�+age�)�7name�5James�
这个示例展示了一个包含了一个键值对的RDB文件的一部分。键是age
,对应的值是27
,键是name
,对应的值是James
。这是一个简化的示例,实际的RDB文件可能包含了大量的键值对。
AOF文件示例:
*2
$3
SET
$4
name
$5
Alice
*2
$3
SET
$3
age
$2
25
这个示例展示了一个包含了两个SET
命令的AOF文件的一部分。第一个SET
命令将键name
的值设置为Alice
,第二个SET
命令将键age
的值设置为25
。每个命令都以Redis协议的格式编码,以便在需要时重新执行。
什么是AOF文件重写?
AOF(Append Only File)文件重写是指通过重新写入AOF文件来减小文件的大小并提高性能的过程。AOF文件重写不会丢失任何数据,因为它会重新构建一个与当前数据相同的AOF文件,但是会删除冗余的命令和优化命令的结构,以减少文件大小并提高读取速度。
为什么要有AOF文件重写?
AOF文件重写的主要目的是减小AOF文件的大小并提高读取性能。随着时间的推移,AOF文件会不断增长,包含越来越多的命令,导致文件变得臃肿并且读取速度变慢。通过定期进行AOF文件重写,可以优化AOF文件的结构,去除冗余命令,从而减小文件大小,提高性能。
AOF文件重写示例:
假设原始AOF文件中包含了如下的命令:
*3
$3
SET
$4
name
$3
qqq
*3
$3
SET
$4
name
$3
qqq
在这个例子中,有两个连续的SET
指令,都是将键name
的值设置为qqq
。在AOF文件重写过程中,这两个指令可能会被合并成一个指令,以减少冗余和提高性能。重写后的AOF文件可能会变成:
*3
$3
SET
$4
name
$3
qqq
通过这样的合并和优化,重写后的AOF文件可以更加紧凑和高效地表示相同的数据状态。
redis在重写过程中,有新的创建请求进来怎么办?
在AOF重写过程中,如果有新的写入请求进来,Redis会将这些写入请求缓存在内存中,直到重写完成。Redis会确保在AOF重写期间不会丢失任何写入请求,因为新的写入请求会先写入到内存中的AOF缓冲区,然后再写入到重写后的AOF文件中。
一旦AOF重写完成,Redis会开始处理缓存在内存中的写入请求,将它们追加到新的AOF文件中。这样可以确保新的写入请求也被持久化到AOF文件中,从而保持数据的一致性和完整性。
在AOF重写过程中,Redis会处理新的写入请求与重写任务之间的竞争,确保数据的一致性和持久性。