首页 > 数据库 >高级java每日一道面试题-2024年9月30日-服务器篇[Redis篇]-Redis持久化有几种方式?

高级java每日一道面试题-2024年9月30日-服务器篇[Redis篇]-Redis持久化有几种方式?

时间:2024-09-30 21:23:02浏览次数:10  
标签:AOF 面试题 java 文件 Redis 快照 RDB 持久

如果有遗漏,评论区告诉我进行补充

面试官: Redis持久化有几种方式?

我回答:

  • Redis 是一个高性能的键值存储系统,常用于缓存、消息队列和实时数据分析等场景。为了保证数据的持久性,Redis 提供了两种主要的持久化方式:RDB(Redis Database Backup)和 AOF(Append Only File)。这两种方式各有优缺点,可以根据具体需求选择合适的持久化策略。

一、RDB(Redis DataBase)持久化

RDB 是一种快照形式的持久化方法,它会在指定的时间间隔内将内存中的数据集快照写入磁盘。RDB 文件是一个经过压缩的二进制文件,适合用于备份和灾难恢复。

定义
  • RDB是一种快照式的持久化方法,它定期将Redis内存中的数据生成快照(snapshot)并写入磁盘上的一个二进制文件中。这个文件包含了当前数据库的所有数据,包括键、值、数据类型等信息。
触发方式
  • 手动触发:通过执行SAVE或BGSAVE命令。其中,SAVE命令会阻塞Redis服务器,而BGSAVE命令在后台执行,不会阻塞Redis服务器的正常操作。
  • 自动触发:根据配置文件中设置的save规则(如save m n,表示m秒内数据发生n次修改时自动触发)自动进行快照。
特点
* RDB文件是经过压缩的二进制文件,体积小,便于备份和迁移。
* 恢复速度快,加载RDB文件可以直接重建数据集。
* 数据安全性相对较低,因为RDB文件是在某一时刻生成的,期间发生的更新可能丢失(取决于save规则间隔)。
优点
  • 性能高:RDB 持久化是通过 fork 子进程来完成的,主进程不会阻塞,因此对 Redis 性能影响较小。
  • 文件紧凑:RDB 文件是经过压缩的,占用的空间相对较小,适合用于备份和传输。
  • 恢复速度快:在服务器重启时,加载 RDB 文件的速度通常比 AOF 快。
缺点
  • 数据丢失风险:如果 Redis 在两次快照之间宕机,那么这段时间内的数据将会丢失。
  • fork 开销:在生成 RDB 文件的过程中,需要 fork 子进程,这可能会导致短暂的性能下降,特别是在大数据集的情况下。
配置
  • 可以通过 redis.conf 文件中的以下配置项来设置 RDB 持久化:

    save 900 1
    save 300 10
    save 60 10000
    
  • 上述配置表示:

    • 如果 900 秒内至少有 1 个键发生变化,则进行一次快照。
    • 如果 300 秒内至少有 10 个键发生变化,则进行一次快照。
    • 如果 60 秒内至少有 10000 个键发生变化,则进行一次快照。

二、AOF(Append Only File)持久化

AOF 是一种日志形式的持久化方法,它会记录服务器执行的所有写操作命令,并在服务器启动时重新执行这些命令以重建数据集。

定义
  • AOF持久化是将Redis执行的每一次写操作(即修改数据集的命令)以文本形式追加到一个日志文件中。这个文件包含了将数据库状态从空文件还原到当前状态所需的所有写操作。
配置方式
  • 通过配置文件redis.conf中的appendonly指令设置AOF持久化开启或关闭。
同步策略
* **always**:每条写命令都同步写入硬盘。
* **everysec**(默认):每秒将缓冲区内容写入硬盘,并且在后台异步刷盘。
* **no**:由操作系统决定何时同步,风险较高,容易丢失数据。
特点
* 数据安全性高,通过AOF文件可以精确还原写操作序列,丢失数据少。
* AOF文件大小通常大于RDB文件,且随写操作增多而增长。
* 重启恢复时,需要重新执行AOF文件中的所有命令,恢复速度相比RDB慢。
* 过度的写操作可能导致AOF文件过大,需要定期进行bgrewriteaof命令进行重写优化,将多条连续的写操作合并为更少的命令。
优点
  • 数据完整性:AOF 持久化可以提供更好的数据完整性,因为它记录了所有的写操作,即使服务器宕机,最多只会丢失最近的一个操作。
  • 可配置的同步策略:AOF 提供了不同的同步策略,如每秒同步、每次操作同步等,可以根据需求调整。
缺点
  • 文件较大:AOF 文件通常比 RDB 文件大,因为它是基于操作命令的日志。
  • 恢复速度较慢:在服务器重启时,AOF 文件的重放速度通常比 RDB 慢。
  • 性能开销:AOF 的写操作会有一定的性能开销,尤其是在高并发写入的情况下。
配置
  • 可以通过 redis.conf 文件中的以下配置项来设置 AOF 持久化:
appendonly yes
appendfsync everysec
  • 上述配置表示:

    • appendonly yes:启用 AOF 持久化。
    • appendfsync everysec:每秒钟同步一次 AOF 文件到磁盘。
  • 其他可用的 appendfsync 选项包括:

    • no:不主动同步,由操作系统决定何时同步。
    • always:每次写操作都同步,安全性最高但性能最低。

三、混合持久化

  1. 定义:Redis 4.0及以后版本支持混合持久化,即在执行BGSAVE时,既生成RDB文件,又将自上次RDB保存以来的增量AOF日志写入到RDB文件末尾。

  2. 优点

    • 利用RDB的快速加载特性快速恢复大部分数据。
    • 再通过加载增量AOF日志补全RDB之后的部分数据,确保数据完整性。
    • 一定程度上结合了RDB和AOF的优点,兼顾数据安全性和恢复速度。

四、总结

  • RDB 适用于需要快速恢复且对数据一致性要求不高的场景。
  • AOF 适用于对数据完整性要求较高的场景,尤其是当数据丢失会造成严重影响时。
  • 混合使用 可以结合两者的优点,提供更高的数据安全性和恢复速度。
    在实际应用中,可以根据业务需求选择合适的持久化策略。如果对数据丢失容忍度低,优先考虑AOF;如果追求快速恢复且有足够的备份机制,可选择RDB。同时,还可以考虑同时使用RDB和AOF两种持久化方式,以充分利用它们各自的优势。无论选择哪种持久化方式,都应配合定期备份策略,进一步增强数据保护。

标签:AOF,面试题,java,文件,Redis,快照,RDB,持久
From: https://blog.csdn.net/qq_43071699/article/details/142663967

相关文章

  • JavaSE的小结10
    第1章-第10节一、知识点网络编程。二、目标理解前后端交互过程。掌握网络编程的基本概念。三、内容分析重点网络编程基本概念。前后端交互过程。难点前后端交互过程。四、内容1、网络编程网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过......
  • Java学习第七天--面向对象
    目录1.学什么 2.类2.1类的组成2.2类与对象的关系3.对象内存图 4.成员变量和局部变量5.this关键字6.构造方法6.1构造器6.2格式:6.3执行时机:6.4构造方法作用6.5构造方法注意事项6.5.1构造方法的创建6.5.2构造方法的重载6.5.3推荐的使用方式7.封装7.1合理隐藏,......
  • redis的数据结构,内存处理,缓存问题
    redisObjectredis任意数据的key和value都会被封装为一个RedisObject,也叫redis对象:这就redis的头信息,占有16个字节redis中有两个热门数据结构1.SkipList,跳表,首先是链表,和普通链表有以下差异:元素按照升序排列存储节点可能包含多个指针,指针跨度不同那么跳表的特点有以下:......
  • java计算机毕业设计社区食堂就餐管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人口老龄化的加剧,社区作为居民生活的基本单元,其服务功能的重要性日益凸显。社区食堂作为连接居民日常生活的重要一环,不仅承载......
  • Java 中的5个代码性能提升技巧,最高提升近10倍
    Java中的5个代码性能提升技巧,最高提升近10倍 文章持续更新,可以关注公众号程序猿阿朗或访问未读代码博客。本文 Github.com/niumoo/JavaNotes 已经收录,欢迎Star。这篇文章介绍几个Java开发中可以进行性能优化的小技巧,虽然大多数情况下极致优化代码是没有必要的,但是作......
  • 什么是javascript的事件循环
    JavaScript的事件循环(EventLoop)是其执行机制的核心,用来处理异步操作,使得JavaScript能够实现非阻塞式的单线程异步编程。为了理解事件循环,首先要了解JavaScript是单线程的语言,这意味着它一次只能执行一个任务。但在实际应用中,比如I/O操作(网络请求、定时器、用户事......
  • Java语言之数据类型与变量
    Java的数据类型主要分为两类基本数据类型:整形(包括:字节型:byte、1个字节,短整型:short、两个字节,整形:int、4个字节,长整型:long、8个字节),字符型:char、一个字节,浮点型(包括:单精度浮点型float、4个字节,双精度浮点型:double、8个字节),布尔类型:boolean,java并没有规定几个字节。java中没有......
  • 用C/C++构建自己的Redis——第五章、Redis中的AVL树实现
    用C/C++构建自己的Redis——第五章、Redis中的AVL树实现文章目录用C/C++构建自己的Redis——第五章、Redis中的AVL树实现前言一、键值对集查询概念1.1键值对集合查询1.2数据结构排序的复习排序数组(SortedArrays)树形数据结构(TreeDataStructures)通过随机性平衡(Balan......
  • [Java手撕]读取文件并进行left join操作
    importjava.io.*;importjava.sql.Time;importjava.util.*;importjava.util.concurrent.*;importjava.util.concurrent.atomic.AtomicInteger;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;publicclassMain......
  • Java开发中操作日志的作用和模块
     Java中的操作日志模块的开发和运行维护都是十分耗时耗力。操作日志的收集涉及到公司的项目或者是上市产品的用户体验和反馈。后端和前端开发工程师的日常工作就是对运行维护工程师收集回来的项目和产品的反馈进行系统级别的分析以及需求下发迭代开发。操作日志的打印方式分为线......