Redis的持久化机制

redis之所以能够提供高速读写操作是因为数据存储在内存中,但是这带来一个风险,在服务器宕机或者断电的情况下,内存中的数据会丢失,为了解决这个问题,redis提供了持久化机制来确保数据的持久性和可靠性

redis的持久化机制分为三种

  • RDB:内存快照

  • AOF:增量日志

  • 前两种的混合持久化

RDB持久化

redis持久化默认开启为RDB持久化

在指定的时间间隔内将内存中的数据集快照写入磁盘,RDB是内存快照(内存数据的二进制序列号形式)的方式持久化,每次都是从redis中生成一个快照来进行数据的全量备份

  1. 手动触发

  • save:阻塞当前Redis进程,直到RDB持久化过程完成,如果内存实例比较大会造成长时间的阻塞,尽量不要使用这种方式

  • bgsave:Redis主进程fork创建子进程,由子进程完成持久化,阻塞时间就很短(微秒级)

    在持久化过程中,RDB的主进程就会fork一个子进程来进行备份,这个时候主进程跟子进程就共享了一个内存(图中共享内存)子进程会先将共享内存写到临时的rdb文件里面,当这个临时文件写完成之后,就会替换掉已经存在的旧的rdb文件,然后子进程旧退出了,在子进程进行备份的操作中,主进程不参与任何IO操作,还是可以继续处理客户端请求。

    在这个过程中,它也是通过cow机制来进行保证的,当我们一个新的写命令过来的时候,cow机制会从我们的共享内存里面将我们的目标key进行一个拷贝,新的这个写操作是针对我们这个内存副本进行操作的,这样旧保证了redis的高性能

    这个指定时间内就是体现在主进程fork一个子进程的这一个阶段

    基本redis内部所有的RDB操作都是采用bgsave的

 

2.自动触发

  • 配置触发

    在配置中集中配置 save m n 的方式,表示 m秒内数据集存在n次修改时,系统自动触发bgsave 操作。

  • shutdown触发

客户端执行shutdown就行

  • flushall触发

flushall清空Redis数据的同时清空dump.rdb文件(等同于删库跑路)

3.优点

  • 性能高,RDB是通过生成一个快照文件来保存数据,因此恢复速度非常快

  • 文件紧凑,RDB文件是二进制格式的数据库文件,相对于AOF文件来说,文件体积较小

4.缺点

  • 可能会丢失数据,由于RDB是定期生成的快照文件,如果Redis意外宕机,最近的一次修改可能会丢失

AOF持久化
  • 全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

  • 然后在服务重启以后,会执行这些命令来恢复数据。

AOF文件重写

  • AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写

  • AOF 文件重写就是把 Redis 进程内的数据转化为写命令,然后同步到新的 AOF 文件中。在重写的过程中,Redis 服务器会创建一个新的 AOF 文件来替代现有的 AOF 文件,新、旧两个 AOF 文件所保存的数据库状态相同,但是新的 AOF 文件不会包含冗余命令。

AOF触发机制

appendfsync always:每次收到写命令就立即强制写入磁盘 appendfsync everysec:每秒钟强制写入磁盘一次,在性能和持久化方面做平衡,推荐该方式。 appendfsync no:完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不推荐。

优点

  • 数据更加可靠,AOF持久化记录了每个写命令的操作,因此在出现故障时,可以通过重新执行AOF文件来保证数据的完整性

  • 可以保留写命令历史:AOF文件是一个追加日志文件,可以用于回放过去的写操作

缺点

  • 文件较大,由于记录了每个写命令,所以AOF文件体积通常比RDB文件大

混合持久化

RDB虽然加载快但是存在数据丢失,AOF数据安全但是加载缓慢,4.0后面就有混合了

相关推荐

  1. Redis持久机制

    2024-06-11 01:16:05       58 阅读
  2. redis持久机制

    2024-06-11 01:16:05       54 阅读
  3. Redis持久机制是怎样

    2024-06-11 01:16:05       42 阅读

最近更新

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

    2024-06-11 01:16:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 01:16:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 01:16:05       82 阅读
  4. Python语言-面向对象

    2024-06-11 01:16:05       91 阅读

热门阅读

  1. 使用Matplotlib进行Python绘图

    2024-06-11 01:16:05       29 阅读
  2. 构建SOA架构时应该注意的问题

    2024-06-11 01:16:05       28 阅读
  3. WPF Frame应用 实现页面跳转

    2024-06-11 01:16:05       31 阅读
  4. 中介子方程十一

    2024-06-11 01:16:05       33 阅读
  5. 对象创建的4种模式

    2024-06-11 01:16:05       25 阅读
  6. centos中sudo: apt: command not found

    2024-06-11 01:16:05       31 阅读
  7. k8s-CCE使用node节点使用VIP--hostNetwork&hostPort

    2024-06-11 01:16:05       28 阅读
  8. 2244. 完成所有任务需要的最少轮数

    2024-06-11 01:16:05       34 阅读