【退役之重学Java】Redis 持久化机制及其选择

2024-05-12 03:12

本文主要是介绍【退役之重学Java】Redis 持久化机制及其选择,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、RDB

RDB 持久化机制,对 Redis 中的数据执行周期性的持久化

二、AOF

AOF 机制对每条写入命令最为日志,以 append-only 的模式写入一个日志文件中,在 Redis 重启的时候,可以通过回放 AOF 日志中的写入指令,来重新构建整个数据集

分析

  • 如果我们想要 Redis 仅仅作为纯内存的缓存使用,那么可以禁止 RDB 和 AOF 所有的持久化机制
  • 通过 RDB 或 AOF,都可以将 Redis 内存中的数据给持久化到磁盘上来然后可以将这些数据备份到别的地方去,比如说云服务
  • 如果 Redis挂了,服务器上的内存和磁盘上的数据都丢了,可以从云服务上拷贝回来之前的数据,放到指定的目录中,然后重新启动 Redis,Redis就会自动根据持久化数据文件中的数据,去回复内存中的数据,继续对外提供服务
  • 如果同时使用 RDB 和 AOF 两种持久化机制,那么在 Redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整

RDB 持久化机制的优点

  1. RDB 会生成多个数据文件,每个数据文件都代表了某一时刻中 Redis 的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去,比如 Amazon 的s3 云服务上去,在国内可以使阿里云的ODPS 分布式存储上,以预定号的备份策略来定期备份 Redis中的数据
  2. RDB 对 Redis 对外提供的读写服务,影响非常小,可以让 Redis 保持高性能,因为 Redis 主进程只需要 fork 一个子进程,让子进程执行磁盘 IO 操作来进行 RDB 持久化即可
  3. 相对于 AOF 持久化机制来说,直接基于RDB 数据文件来重启和恢复 Redis 进程,更加快速

RDB 持久化机制的缺点

  1. 如果想要在 Redis 故障时,尽可能少的丢失数据,那么RDB没有 AOF 好,一般来说, RDB数据快照文件,都是每隔 5 分钟,或者更长时间生成一次,这个时候就得接受一点 Redis 进程宕机,那么会就是最近 5 分钟的数据
  2. RDB 每次在 fork 子进程来执行 RDB 快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,甚至数秒

AOF 持久化机制的优点

  1. AOF 可以更好的保护数据不丢失,一般 AOF会每隔1秒,通过一个后台线程执行一次 fsync 操作,最多丢失 1s 的数据
  2. AOF 日志文件以 append-only 模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复
  3. AOF 日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写,因为在 rewrite log 的时候,会对其中的指导进行压缩,创建出一份需要回复数据的最小日志出来。创建新日志文件的时候 ,老的日志文件还是照常写入。当新的 merge 后的日志文件 ready 的时候,再交换新老日志文件即可。
  4. AOF 日志文件的命令通过非常刻度的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。

AOF 持久化机制的缺点

  1. 对于同一根数据来说,AOF 日志文件通常比 RDB 数据快照文件更大
  2. AOF 开启后,支持的写 QPS 回避 RDB 支持的写QPS 低,因为 AOF 一般会配置成每秒一次 fsync ,性能也是非常高的
  3. 以前 AOF 发生过 bug,就是通过 AOF记录的日子,进行数据恢复的时候,没有恢复成一模一样的数据出来,所以说,类似 AOF这类比较复杂的基于命令日志/merge/回放的方式,比基于 RDB 每次持久化一根万传给你的数据快照文件的方式,更加脆弱一些,容易有bug。不过 AOF 为了避免 rewrite 郭传给你导致的 bug, 因此每次 rewrite 并不是基于就的指令日志进行 merge 的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

RDB 和 AOF 到底该如何选择

  1. 不要仅仅使用 RDB,那样会导致你丢失很多数据
  2. 也不要仅仅使用 AOF, 因为那样有两个问题
    • 通过 AOF 做冷备,没有 RDB 做冷备来得恢复速度更快
    • RDB 每次简单粗暴生成数据快照,更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的bug
  3. 综合使用 AOF 和RDB 两种持久化机制
    • 用 AOF 保证数据不丢失,作为数据恢复的第一选择
    • 用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复

此系列博客,为学习笔记,若有侵权,请联系我删除

这篇关于【退役之重学Java】Redis 持久化机制及其选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981443

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听