RDB
RDB是Redis的一种持久化机制,它以二进制格式将数据存储在硬盘上。RDB持久化通过将内存中的数据快照保存到硬盘上的文件中,以在Redis重启时重新加载数据。RDB文件是非常紧凑和紧凑的,适合用于备份和恢复数据,在内存消耗较少的场景下使用。相比于AOF(Append Only File)持久化机制,RDB具有更快的恢复速度,但可能会造成数据丢失。
事务
事务的执行流程:
-
开始事务:使用MULTI命令开启一个事务,此时Redis进入事务状态。
-
队列指令:在事务状态下,所有的指令并不立即执行,而是放入一个队列中等待执行。
-
执行指令:在事务状态下,可以继续执行各种Redis指令,这些指令会被添加到队列中。
-
提交事务:使用EXEC命令提交事务,Redis会按照队列中指令的顺序依次执行。
-
返回结果:事务执行完成后,会返回每个指令的执行结果。
如果在事务执行过程中出现错误,Redis会继续执行剩余的指令,而不会回滚已经执行的指令。因此,在使用事务时需要注意不要发生错误或者手动进行回滚。
指令"SET"的处理:
如果SET指令在事务状态下被执行,它会判断当前是否在事务状态中。如果不在事务状态,则直接执行指令并返回结果。如果在事务状态,则将该指令添加到当前事务队列中,并返回"QUEUED"表示已经在队列中。
事务的注意事项:
-
没有自动回滚:Redis事务不会自动回滚,发生错误后需要手动回滚或者重新执行正确的指令。
-
锁机制:可以使用WATCH指令在事务执行之前对某个key进行监视,如果在执行事务之前该key发生了变化,事务会被终止执行。
-
过期键的删除策略:Redis有两种过期键的删除策略。惰性过期是指只有在访问某个key时才会判断其是否过期,并进行清理;定期过期是指Redis会定期扫描过期键,并进行清理。
RDB工作原理
Redis是一个基于内存的开源键值存储系统,它支持持久化数据并允许将数据存储在磁盘上。Redis使用RDB(Redis Database)持久化机制来将内存中的数据保存到磁盘上。
Redis RDB持久化的工作原理如下:
-
快照生成:当符合一定条件时,Redis会触发RDB快照生成操作。这些条件可以通过配置文件中的参数来设置,例如在指定的时间间隔内多少次写操作或者多少秒内数据集的大小超过一定阈值。
-
快照生成过程:当触发快照生成操作时,Redis会fork一个子进程来处理快照生成过程,而父进程继续接受并处理客户端的命令。
-
内存数据写入:子进程首先会将内存中的数据写入到临时文件中。为了避免在快照生成过程中对数据进行修改,子进程会通过复制父进程的内存数据,并在此基础上进行写操作,这个复制过程是通过写时复制(copy-on-write)实现的。
-
数据写入到临时文件:子进程将内存数据写入到临时文件时,Redis会先将数据以Redis特定的格式写入到临时文件中。
-
原子性替换:当子进程完成写入操作后,Redis会使用临时文件替换掉旧的RDB文件。在这个过程中,Redis使用原子性操作来确保数据的一致性。
-
完成持久化:替换操作完成后,子进程将退出并释放相关资源,持久化过程完成。
需要注意的是,RDB持久化机制存在一定的缺点,例如:
- 如果系统崩溃,可能会导致最后一次RDB持久化之后的数据丢失。
- RDB持久化需要将内存数据全部写入磁盘,对于大的数据集来说可能需要较长时间,并且可能会导致Redis阻塞。
AOF和RDB
Redis中的AOF(Append Only File)和RDB(Redis Database)是两种持久化机制,可以用于将Redis的数据持久化到硬盘上。
AOF持久化机制通过将Redis服务器的操作命令以追加的方式写入到一个文件中,其中包含了重建数据集的所有操作命令。AOF文件的优势是可读性好,可以通过AOF文件来恢复数据,同时也可以轻松地将AOF文件进行备份和复制。
RDB持久化机制则是将Redis的数据集以二进制文件的形式保存到硬盘上。RDB文件的优势是占用的空间相对较小,同时在进行数据恢复时也比较快速。
在实际使用中,可以将AOF和RDB两种持久化机制搭配使用,以提高数据的可靠性和恢复的效率。
当两种持久化机制同时开启时,Redis会优先使用AOF来进行数据恢复。当Redis重启时,会先尝试加载AOF文件来恢复数据集。如果AOF文件不存在或者加载失败,则会尝试加载RDB文件来进行恢复。
基于以上机制,可以在Redis中使用以下配置来搭配使用AOF和RDB持久化机制:
# 开启AOF持久化机制
appendonly yes
# 设置AOF文件名
appendfilename "appendonly.aof"
# 设置AOF自动重写规则
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 开启RDB持久化机制
save 900 1 # 在900秒(15分钟)内,如果至少有1个key发生了变化,则进行持久化
save 300 10 # 在300秒(5分钟)内,如果至少有10个key发生了变化,则进行持久化
save 60 10000 # 在60秒(1分钟)内,如果至少有10000个key发生了变化,则进行持久化
# 设置RDB文件名
dbfilename "dump.rdb"
通过以上配置,可以实现每次操作都将Redis的命令追加到AOF文件中,同时也定期将数据以RDB文件的形式进行持久化。这样即使Redis意外宕机,也可以通过AOF文件和RDB文件来进行数据恢复。
总结
Redis中有两种持久化机制,分别是RDB持久化和AOF持久化。
-
RDB持久化:
- RDB持久化是将Redis的内存数据以二进制文件的形式保存到硬盘上。它会在指定的时间间隔内或者指定的写操作数量达到一定值时,对Redis的数据进行快照备份。
- RDB持久化方式适用于大规模的数据恢复,因为其备份文件通常比AOF文件小得多,恢复数据的时间也比较短。
- RDB备份文件可以手动触发生成,也可以在Redis启动和关闭时自动创建和载入。
- RDB持久化在恢复数据时速度快,但会丢失最近一次快照与当前快照间发生的数据变更。
-
AOF持久化:
- AOF持久化是将Redis的写操作以追加的方式记录到一个日志文件中,通过重新执行写操作来恢复数据。AOF文件是一个文本文件,记录了Redis服务器接收到的每个写操作指令。
- AOF持久化方式适用于数据实时性要求较高的场景,因为它可以实时记录每次写操作,保证数据的完整性和可靠性。
- AOF文件会随着写操作的增加而不断增大,可以通过配置参数自动进行AOF文件的压缩和重写,以减少文件的大小。
- AOF持久化在恢复数据时的速度相对较慢,因为需要重新执行AOF文件中的所有写操作。但它可以提供更高的数据可靠性,因为可以通过AOF文件逐条重放来恢复数据,避免了RDB持久化可能丢失的数据。
RDB持久化适用于大规模数据恢复场景和对数据实时性要求不高的场景,而AOF持久化适用于数据实时性要求高的场景,能够提供更高的数据可靠性。