Redis持久化

为什么要持久化?

Redis是一种支持内存存储的键值对数据库,它可以将数据存储在内存中以提供高性能的读写操作。然而,由于内存的易失性,一旦Redis进程关闭或服务器断电,内存中的数据将会丢失。为了解决这个问题,Redis提供了持久化机制,将数据写入磁盘以便在重启后进行恢复。

Redis支持两种主要的持久化方式:

1. RDB(Redis数据库文件)持久化

RDB持久化是通过将Redis的数据快照写入磁盘来实现的。当满足一定条件时(如在指定的时间间隔内有指定数量的写操作),Redis会自动触发RDB持久化操作。该操作会生成一个二进制文件,包含了当前内存中的所有数据。RDB持久化是非常紧凑和高效的,适合用于备份、灾难恢复和数据迁移。

执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令

  • 执行bgsave命令

  • Redis停机时

  • 触发RDB条件时

1)save命令

执行下面的命令,可以立即执行一次RDB:(save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。)

2)bgsave命令

下面的命令可以异步执行RDB(执行的时候主进程不受影响,可以继续处理用户的请求)

3)停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# x秒内,如果至少有y个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save x y

2. AOF(Append Only File)持久化

AOF持久化是通过将Redis的所有写操作追加到一个文件中来实现的。当Redis重启时,会重新执行这个文件中的写操作来恢复数据。AOF持久化可以确保数据的完整性和持久性,但相对于RDB持久化,它的文件通常会更大,恢复时间也更长。

AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

AOF持久化有三种不同的同步策略可供选择:

我们可以在Redis的配置文件中设置AOF持久化的同步策略和其他相关配置。

  • always:每个写操作都立即同步到磁盘,保证最高的数据安全性,但性能较低。
  • everysec:每秒同步一次,平衡了数据安全性和性能。
  • no:完全依赖操作系统进行同步,性能最高,但数据安全性较低。

AOF文件重写

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

总结

两种持久化方式的不同:
 

  1. 数据格式:

    • RDB持久化:RDB持久化通过生成一个二进制的数据快照文件来保存Redis的数据。该文件是以二进制格式存储的,相对紧凑,适合用于备份、灾难恢复和数据迁移。
    • AOF持久化:AOF持久化通过将Redis的写操作以日志的形式追加到一个文件中。该文件以文本格式存储,包含了Redis的命令和参数,以易读易理解的方式记录了数据的变化。
  2. 持久化过程:

    • RDB持久化:RDB持久化是通过在指定的时间间隔内或写操作达到指定数量阈值时,生成一个快照文件,将内存中的数据写入磁盘。RDB持久化是一个全量持久化过程,即将当前时刻的所有数据保存到文件中。
    • AOF持久化:AOF持久化是通过将每个写操作追加到AOF文件的末尾来实现。当Redis重启时,它会重新执行AOF文件中的写操作来恢复数据。AOF持久化是一个增量持久化过程,即将写操作追加到文件中,记录数据的变化。
  3. 文件大小和恢复时间:

    • RDB持久化:由于RDB文件是二进制的数据快照,相对较小,恢复速度较快。但它只包含了某个时间点的数据,如果Redis关闭时发生故障,可能会丢失最后一次快照之后的数据。
    • AOF持久化:AOF文件以文本格式存储Redis的写操作,相对较大,恢复速度较慢。但它包含了所有写操作的日志,可以保证更高的数据完整性,即使Redis关闭时发生故障,也可以通过重放AOF文件来恢复所有数据。
  4. 同步策略:

    • RDB持久化:RDB持久化并不会实时同步数据到磁盘,而是在指定的时间间隔内或写操作达到指定数量阈值时进行。因此,存在一定的数据丢失的风险。
    • AOF持久化:AOF持久化可以选择不同的同步策略,如always、everysec和no。always会在每个写操作后立即同步到磁盘,保证最高的数据安全性;everysec会每秒同步一次,平衡了数据安全性和性能;no则完全依赖操作系统进行同步,性能最高但数据安全性较低。

我们还可以同时启用RDB持久化和AOF持久化,以提供更高的数据安全性和恢复能力。在Redis重启时,它会首先加载AOF文件,然后再使用RDB文件进行恢复。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 22:50:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 22:50:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 22:50:02       82 阅读
  4. Python语言-面向对象

    2023-12-06 22:50:02       91 阅读

热门阅读

  1. vue管理系统模版

    2023-12-06 22:50:02       65 阅读
  2. UVa1583生成元(Digit Generator)

    2023-12-06 22:50:02       53 阅读
  3. Python 模块的使用方法

    2023-12-06 22:50:02       65 阅读
  4. AIGC: 关于ChatGPT中基于Whisper模型实现音频转文本

    2023-12-06 22:50:02       57 阅读
  5. C语言词法陷阱

    2023-12-06 22:50:02       53 阅读
  6. C# IList 与List区别&二叉树的层序遍历

    2023-12-06 22:50:02       51 阅读
  7. 面试:如何故意减慢网站速度?

    2023-12-06 22:50:02       57 阅读
  8. 普中STM32 单片机资料

    2023-12-06 22:50:02       48 阅读