redis数据如何落盘

worktile 其他 21

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Redis的数据落盘主要涉及两个方面:RDB持久化和AOF持久化。

    1. RDB持久化:
      RDB是Redis的一种快照持久化方式,即将当前时刻的数据以二进制格式保存到硬盘上。RDB持久化的过程如下:
    • Redis会fork出一个子进程来执行持久化操作,以减少对主线程的影响。
    • 子进程会将数据写入临时文件中。
    • 当子进程完成持久化过程后,会用这个临时文件替换原来的RDB文件。
    • RDB文件保存在硬盘上,Redis重启时可以通过加载RDB文件来恢复数据。

    你可以通过以下配置项来配置RDB持久化的方式和频率:

    • save:指定在n秒内有m个key发生变化时进行RDB持久化。例如save 900 1表示在900秒内至少1个key进行了变化就会触发持久化操作。
    • stop-writes-on-bgsave-error:当RDB持久化过程出错时,是否停止写入操作。
    • rdbcompression:是否对RDB文件进行压缩。
    • rdbchecksum:是否对RDB文件进行校验。
    1. AOF持久化:
      AOF(Append Only File)持久化是将Redis的操作日志以命令的方式追加到文件中。AOF持久化的过程如下:
    • Redis会将每个写命令追加到AOF文件末尾,以实现数据的持久化。
    • AOF文件不断增长,因此Redis会周期性地对AOF文件进行重写,以减小文件大小。
    • AOF重写过程中,Redis会创建一个新的AOF文件,将内存中的数据写入新文件,并在写入过程中优化命令的格式。
    • 当新文件写入完成后,Redis会将新文件重命名为AOF文件,并继续往新文件中追加写入。

    你可以通过以下配置项来配置AOF持久化的方式和频率:

    • appendonly:是否开启AOF持久化。
    • appendfsync:指定数据何时被同步到AOF文件。有以下三个选项:
      • no:表示不主动同步,由操作系统决定合适的时机进行同步。
      • always:表示每次写入操作都要同步到磁盘,保证数据的完整性。
      • everysec:表示每秒同步一次,这是默认配置,可以在数据安全和性能之间做一个平衡。

    为保证数据的可靠性,建议同时开启RDB持久化和AOF持久化。这样即使Redis因为意外而崩溃,可以通过RDB文件和AOF文件的恢复来保证数据的完整性。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论
    1. Redis的数据落盘一般是通过快照(snapshotting)方式实现的。Redis会周期性地将内存中的数据快照写入磁盘,以防止数据丢失。

    2. 快照可以通过两种方式进行:全量快照和增量快照。全量快照是将整个数据集保存到磁盘,而增量快照只保存自上次快照以来发生变化的数据。

    3. Redis通过fork子进程来完成快照操作。首先,Redis会fork出一个子进程,然后子进程会将内存中的数据写入到一个临时RDB文件中。写入完成后,子进程再替换掉原来的RDB文件,以保证原子性。

    4. Redis还提供了AOF(Append-Only File)持久化机制。在AOF模式下,Redis将每个收到的写入命令都追加到一个文件中。当Redis重启时,可以通过重新执行AOF文件中的所有写入命令来还原数据库。

    5. Redis还支持将快照和AOF持久化机制结合起来使用。可以通过设置合适的配置选项,使得当AOF文件过大时,自动执行快照操作来压缩文件大小。这样既可以保证数据的安全性,又不会占用过多的磁盘空间。

    总结:Redis数据落盘一般通过快照和AOF持久化机制实现。快照是将内存中的数据写入磁盘的一种方式,可以通过全量快照和增量快照来实现。AOF则是将写入命令追加到文件中,以保证数据的持久性和完整性。可以将快照和AOF结合起来使用,以达到更好的效果。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Redis是一种内存数据库,它将数据存储在主存储器中,而不是硬盘上。这使得Redis具有出色的读写性能。但是,由于数据存储在内存中,当服务器发生故障或重启时,数据将丢失。为了解决这个问题,Redis提供了一种将数据定期或在每次更新时将数据持久化到磁盘的机制,以便在恢复之后重新加载数据。

    Redis提供了两种主要的持久化方式:

    1. 快照(Snapshot)持久化
    2. AOF(Append-Only File)持久化

    下面分别介绍这两种持久化方式的工作流程和操作过程:

    1. 快照(Snapshot)持久化

    快照持久化是将Redis服务器的内存中数据直接写入到磁盘上的一个二进制文件。当Redis需要恢复数据时,它会读取该快照文件,并将数据加载到内存中。

    快照持久化的工作流程大致如下:

    1. Redis管理员或开发人员执行SAVE或BGSAVE命令。
    2. 如果执行的是SAVE命令,则Redis会阻塞,直到持久化过程完成;如果执行的是BGSAVE命令,则Redis会派生一个子进程来执行持久化过程,而不会阻塞其他客户端操作。
    3. 子进程将当前内存中的数据拷贝到一个临时文件中。
    4. 子进程完成数据写入后,将临时文件重命名为Redis的快照文件。
    5. Redis将快照文件存储在磁盘上的指定位置。

    保存快照的过程通常由Redis自身触发,但也可以通过配置文件中的save指令来手动配置定期的快照持久化。

    2. AOF(Append-Only File)持久化

    AOF持久化是将所有Redis服务器接收到的写命令追加到一个日志文件中。该日志文件是一个文本文件,可以通过简单的文本编辑器查看和修改。当Redis需要恢复数据时,它会从头到尾重新执行一遍日志文件中的写命令。

    AOF持久化的工作流程大致如下:

    1. Redis管理员或开发人员通过配置文件中的appendfsync指令来指定AOF持久化的方式。有三种选择:always、everysec、no。
      • always:每次写入命令都立即将命令追加到日志文件中,效率最低但是最安全。
      • everysec:每秒钟将命令追加到日志文件中,比always方式高效但是一旦Redis发生故障,可能会丢失一秒钟的数据。
      • no:Redis将命令追加到OS缓冲区,由操作系统决定何时将缓冲区的数据写入磁盘,这是最高效的方式,但是在发生故障时可能会丢失较多的数据。
    2. Redis将收到的每个写命令追加到AOF日志文件中。
    3. Redis周期性地将AOF日志文件进行重写(rewrite)操作,以减小文件的大小并提高读取性能。
    4. 恢复时,Redis将逐行执行AOF日志文件中的命令,以重新构建数据库中的数据。

    AOF持久化相对于快照持久化来说,可以更好地保证数据恢复的完整性,因为它会记录每个写命令。

    在实际应用中,可以根据业务需求和性能要求选择适合的持久化方式,也可以同时使用快照持久化和AOF持久化来提供更好的数据保护和恢复能力。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部