首页 > 数据库 >Redis持久化机制

Redis持久化机制

时间:2024-11-01 09:50:49浏览次数:3  
标签:文件 持久 fsync AOF Redis RDB 快照 化机制

持久化目的:对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中。大部分原因是为重用数据,比如重启机器、机器故障之后恢复数据,或者做数据同步,比如 Redis 集群的主从节点通过 RDB 文件同步数据。

支持3种持久化方式:

  • 快照(RDB)
  • 只追加文件(AOF)
  • RDB 和 AOF 的混合持久化

RDB持久化

概念:通过创建快照来获得存储在内存里面的数据在 某个时间点 上的副本。Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用。

快照持久化是 Redis 默认采用的持久化方式,在 redis.conf 配置文件中默认有此下配置:

save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。

AOF持久化

相比于快照持久化,AOF持久化的实时性更好

开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到 AOF 缓冲区 server.aof_buf 中,然后再写入到 AOF 文件中(此时还在系统内核缓存区未同步到磁盘),最后再根据持久化方式( fsync策略)的配置来决定何时将系统内核缓存区的数据同步到硬盘中的。

AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir 参数设置的,默认的文件名是 appendonly.aof

AOF工作流程

  1. 命令追加(append):将所有写命令追加到AOF缓冲区中。
  2. 文件写入(write):将AOF缓冲区的数据写入到AOF文件中,这一步需要系统调用write函数,将数据写入到系统内核缓冲区之后直接返回(延迟写)。
  3. 文件同步(fsync):AOF 缓冲区根据对应的持久化方式( fsync 策略)向硬盘做同步操作。), 系统调用fsync函数 针对单个文件操作,对其进行强制硬盘同步,fsync 将阻塞直到写入磁盘完成后返回,保证了数据持久化。
  4. 文件重写(rewrite):随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  5. 重启加载(load):当 Redis 重启时,可以加载 AOF 文件进行数据恢复。

系统调用:linux系统直接提供函数用于对文件和设备访问和控制。

AOF工作流程

AOF持久化方式(fsync策略)有哪些?

  • appendfsync always:主线程调用 write 执行写操作后,后台线程( aof_fsync 线程)立即会调用 fsync 函数同步 AOF 文件(刷盘),fsync 完成后线程返回,这样会严重降低 Redis 的性能(write + fsync)。

  • appendfsync everysec:主线程调用 write 执行写操作后立即返回,由后台线程( aof_fsync 线程)每秒钟调用 fsync 函数(系统调用)同步一次 AOF 文件(write+fsyncfsync间隔为 1 秒)

  • appendfsync no:主线程调用 write 执行写操作后立即返回,让操作系统决定何时进行同步,Linux 下一般为 30 秒一次(write但不fsyncfsync 的时机由操作系统决定)。

这三种同步方式区别在于fsync同步AOF文件的时机(刷盘)。

AOF重写了解吗?

当 AOF 变得太大时,Redis 能够在后台自动重写 AOF 产生一个新的 AOF 文件,这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。

AOF重写

由于 AOF 重写会进行大量的写入操作,为了避免对 Redis 正常处理命令请求造成影响,Redis 将 AOF 重写程序放到子进程里执行。

AOF 文件重写期间,Redis 还会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新 AOF 文件期间,记录服务器执行的所有写命令。当子进程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新的 AOF 文件保存的数据库状态与现有的数据库状态一致。最后,服务器用新的 AOF 文件替换旧的 AOF 文件,以此来完成 AOF 文件重写操作。

存在问题:Redis 7之前,如果在重写期间有写入命令,AOF 可能会使用大量内存,重写期间到达的所有写入命令都会写入磁盘两次。

Redis7之后,实现了Multi-part AOF机制来解决,具体采用base(全量数据) + inc(增量数据)独立文件存储的方式,彻底解除内存和IO资源的浪费。

AOF校验机制了解吗?

Redis 在启动时对 AOF 文件进行检查,以判断文件是否完整,是否有损坏或者丢失的数据。通过使用 校验和(checksum) 的数字来验证 AOF 文件。这个校验和是通过对整个 AOF 文件内容进行 CRC64 算法计算得出的数字。如果文件内容发生了变化,那么校验和也会随之改变。因此,Redis 在启动时会比较计算出的校验和与文件末尾保存的校验和(计算的时候会把最后一行保存校验和的内容给忽略点),从而判断 AOF 文件是否完整。

如何选择RDB 和 AOF

RDB 比 AOF 优秀的地方

  • RDB 文件存储的内容是经过压缩的二进制数据, 保存着某个时间点的数据集,文件很小,适合做数据的备份,灾难恢复。AOF 文件存储的是每一次写命令,类似于 MySQL 的 binlog 日志,通常会比 RDB 文件大很多。当 AOF 变得太大时,Redis 能够在后台自动重写 AOF。新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。
  • 使用 RDB 文件恢复数据,直接解析还原数据即可,不需要一条一条地执行命令,速度非常快。而 AOF 则需要依次执行每个写命令,速度非常慢。也就是说,与 AOF 相比,恢复大数据集的时候,RDB 速度更快。

AOF 比 RDB 优秀的地方

  • RDB 的数据安全性不如 AOF,没有办法实时或秒级持久化数据。生成 RDB 文件的过程是比较繁重的, 虽然 BGSAVE 子进程写入 RDB 文件的工作不会阻塞主线程,但会对机器的 CPU 资源和内存资源产生影响,严重的情况下甚至会直接把 Redis 服务干宕机。AOF 支持秒级数据丢失(取决 fsync 策略,如果是 everysec,最多丢失 1 秒的数据),仅仅是追加命令到 AOF 文件,操作轻量。
  • RDB 文件是以特定的二进制格式保存的,并且在 Redis 版本演进中有多个版本的 RDB,所以存在老版本的 Redis 服务不兼容新版本的 RDB 格式的问题。
  • AOF 以一种易于理解和解析的格式包含所有操作的日志。你可以轻松地导出 AOF 文件进行分析,你也可以直接操作 AOF 文件来解决一些问题。比如,如果执行FLUSHALL命令意外地刷新了所有内容后,只要 AOF 文件没有被重写,删除最新命令并重启即可恢复之前的状态。

综上

  • Redis 保存的数据丢失一些也没什么影响的话,可以选择使用 RDB。
  • 不建议单独使用 AOF,因为时不时地创建一个 RDB 快照可以进行数据库备份、更快的重启以及解决 AOF 引擎错误。
  • 如果保存的数据要求安全性比较高的话,建议同时开启 RDB 和 AOF 持久化或者开启 RDB 和 AOF 混合持久化。

标签:文件,持久,fsync,AOF,Redis,RDB,快照,化机制
From: https://blog.csdn.net/m0_74119287/article/details/143423778

相关文章

  • Redis面试总结(一)
    1、除了Redis,你还知道其他分布式缓存方案吗?redis痛点问题:内存占用高,数据可靠性差,业务维护缓存和存储一致性繁琐。腾讯开源的Tendis也是分布式高性能KV存储数据库。Tendis特征:完全兼容Redis协议,支持绝大多数redis的指令持久化存储:使用rocksdb作为存储引擎去中心化架构:类......
  • 关于pinia持久化问题失败这件事(另附官方持久化教程)
    唉,持久化大坑,怎么搞网上大多数的解释是这里的pinia定义了两次的问题,但是真的是这样吗好多人发现,我没定义两次也会啊,这是为啥以此为例,发现华点没有,你想存的信息直接返回的时候返回掉就行,如果不是直接返回掉而是用get方法包装的话就会失效总之,想存的数据必须直接返......
  • 【全】Go 操作Redis数据库
    操作Redis数据库在Go语言中是一项常见的任务,尤其是在构建高性能应用时。以下是一个关于如何使用Go操作Redis的详细指南,涵盖了从安装、配置到不同数据类型操作的各个层次(初级、中级、高级)。1.Go操作Redis实战介绍Redis是一个开源的内存数据结构存储,支持多种数......
  • Redis学习:BigKey、缓存双写一致性更新策略和案例
    Redis学习:BigKey、缓存双写一致性更新策略和案例文章目录Redis学习:BigKey、缓存双写一致性更新策略和案例1.BigKey2.缓存双写一致性更新策略3.缓存双写一致性案例1.BigKey面试题MoreKey不可以使用keys*,要使用SCAN基于游标来查询所有的key通过在redis.con......
  • redis高级部分
    一、Redis主从复制主从复制架构只是用来解决数据的冗余备份,从节点只是用来同步数据二、Redis哨兵机制(HadoopHA)哨兵Sentine机制由一个或者多个哨兵(Sentinel)实例组成的Sentinel实例系统可以监视任意多个服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线......
  • redis 命令
    数据库操作指令查看当前数据库中的所有键key*1.对于一个redis服务而言,包含默认有16个数据库给我们使用,从0开始编号,共15号数据库,默认使用的是0号数据库切换库,select库号举例:使用1号库:select1库和库之间数据不共享库和库之间的键可以重名2.Redis中清空库的指令清空当......
  • redis中知识以及面试题
    一、非关系型数据库NoSql如下四种类型都是非关系型数据库1.键值存储数据库(Key-Value)如redis,就是键值存储数据库2.列存储数据库如clickhouse是列存储3.文档型数据库4.图形数据库(Graph)二、redis的特点redis是一个高性能的非关系型数据库,其中的所有数据形式都是以键值对的方......
  • redis 安装
    什么是Redis总结:redis是一个内存型的数据库Redis特点(面试必问)-Redis是一个高性能key/value内存型数据库在redis中,所有的数据形式都是以键值对的方式来存储的-Redis支持丰富的数据类型string,list,set,sortedset,hash指的是键值对中的值的类型-Redis支持持......
  • Redisson 使用示例
    Redisson是一个Java的Redis客户端,基于Redis实现了许多分布式数据结构和功能,例如分布式锁、缓存、限流器、布隆过滤器等。以下是一些常见的Redisson使用示例,来自ChatGPT,用于自学。Redisson提供了 RLock 接口用于实现分布式锁,适用于需要同步访问共享资源的分布式应用......
  • redisr的发布与订阅
    redis发布订阅理解图发布者(Publisher)使用PUBLISH命令将消息发布到指定的频道。订阅者(Subscriber)使用SUBSCRIBE命令订阅一个或多个频道以接收消息。所有订阅同一频道的订阅者都会收到此消息。频道(Channel)频道是消息的通道,发布者通过指定频道来发布消息,订阅者通过......