百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis的持久化

mhr18 2024-11-18 14:33 21 浏览 0 评论

为什么需要持久化

我们知道Redis是一款内存数据库,为提升性能,它把所有数据全部存储在内存中,而内存内的数据并不是永久地保留下来,服务器出现宕机或重启后,内存数据会先清空。redis在此之前存在内存的数据也会被清空,这样有问题吗?

不,不一定有问题,这是一款定位为内存型的数据库,数据存在内存上被清空了,不是很正常吗?这么说,好像也有道理。我说不一定有问题是有前提下,例如在某些场景下,我们使用redis来缓存一些配置数据,数据量不大,原始数据都在关系型数据上存着,如果重启后,内存没数据,调用一次数据库查询命令,把数据加载回来就好了。这种场景似乎也是可以不用持化的。

那说了不一定有问题的场景后,哪些场景不用持久化会有问题呢?在现代的互联网时代,高并发,高性能,高可用,大数据量都是基本的需求了,在这种高压的情况下,如果redis没有持久化,这大量的请求与大量的数据查询命令打到数据库上,不用说,数据库也被打垮了,这时就会牵一发死全身,整个平台涉及到这个数据库的业务都不可用了,而依赖这些服务的其他业务也变得不可用了,这种场景,不敢想像。所以,综合,redis需要持久化吗?

持久化使得redis服务器重启时,可以通过重新加载存储在硬盘中的数据,快速地恢复到redis服务器宕机前的状态。那么redis的持久化有哪些方式呢?这些方式都有哪些差别与优缺点呢?请看下文介绍

持久化有哪些方式

redis的持久化机制可以分为两种,即RDB与AOF。

RDB:Redis DataBase,将某一时间点的当前数据以快照的形式保存下来,存储格式简单,关注点在于数据,存储的是二进制数据

AOF:Append Only File,将数据的操作过程(读命令不记录)以日志形式进行存储,存储格式复杂,关注点在操作过程。

一、RDB

Redis DataBase,快照持久化。所谓的快照,在这里指的是某一时刻的内存数据,而持久化则是将这一时刻的数据以二进制形式写入到磁盘中,文件名字为dump.rdb

1、自动触发机制

持久化策略的配置项为:save N M,//让redis在“N秒内至少有M个改动”才会触发一次rdb的持久化操作。

例如redis的默认策略有:(这里的配置是使用bgsave来完成)

save 900 1   -- 900秒内至少有一个改动
save 300 10		-- 300秒内至少有10个改动
save 60 10000	-- 60秒内至少有10000个改动

上述的配置是使redis满足一定的条件后,会自动触发一次生成快照,同样也可以使用手动触发生成快照文件,即命令save或bgsave。

2、手动触发机制

2.1 save命令-阻塞式持久化

Redis处理命令的方式是以单线程形式进行的,客户端的请求都会放到一个队列里,当执行save命令时,如果执行时间很长的话,后面的命令请求就会被阻塞,客户端所发送的命令都会被拒绝

2.2 bgsave命令-利用子进程,非阻塞式持久化

与save不同的是,执行过程中,它并不会阻塞客户端的请求。它将持久化的工作交给了子进程来执行,主进程还是可以如常地处理来前客户端的请求

Redis借助了linux系统的写时复制(Copy-On-Write)技术,在生成快照的同时,仍然可以接收命令处理数据。简单来说,bgsave线程是由主线程fork生成的子线程,可以共享主线程所有的内存数据。bgsave线程运行后,开始读取主线程的内存数据,也就是redis的内存数据,将内存数据写入到dump.rdb文件中。此时如果主线程处理的命令都是读操作,则bgsave线程不受影响。如果主线程处理了写操作,则会对该命令操作的数据复制一份,生成副本,bgsave线程把这个副本写入到dump.rdb文件中,而这个过程中,主线程仍可执行命令。

2.3 save与bgsave的对比


save

bgsave

IO类型

同步

异步

是否阻塞其它命令

否(调用系统生成子进和fork时会阻塞)

复杂度

O(n)

O(n)

优点

不会消耗内存

不阻塞其它命令

缺点

阻塞操作

会消耗额外的内存

配置自动生成rdb文件后台使用的是bgsave方式。

RDB的优缺点:

  • 优点:
    • RDB是一个紧凑压缩的二进制文件,存储效率高
    • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
    • RDB恢复数据的速度要比AOF快得多
    • 应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复
  • 缺点
    • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的丢数据的可能性
    • bgsave指令每次运行都要执行fork操作创建子进程,要牺牲一些性能
    • Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本之间数据格式无法兼容现像(处理方式:可以降低版本的rdb读出来,然后存在高版本的大redis)

二、AOF

AOF:append only file,以独立日志的方式来记录每次命令(查询命令除外),只允许追加文件,不允许修改文件,类似于mysql的binlog日志文件一样。Redis启动时会读取AOF文件中的所有操作命令,然后执行,这就有点像一个人一生所有事件的回顾,直至到把所有事件执行完成,启动成功,并完成数据的恢复工作。

AOF写数据过程

  1. redis收到来自客户端的操作命令,先存一个在队列中,命令得一个一个执行
  2. redis把命令执行成功后,会把该命令执行的日志写到系统的缓冲区(Buffer)
  3. redis并不会对命令进行语法检验,只记录执行成功的命令,失败的命令不会记录下来,避免日后恢复时也出现失败的情况
  4. 写到buffer的数据,redis会按照设置的策略(always,everysec,no)调用操作系统的write函数把buffer中的数据刷到磁盘中去
  • always每次写操作都同步到 AOF 文件中,数据零误差,性能较低,不建议使用。
  • everysec每秒将缓冲区中的指令同步到 AOF 文件中,数据准确性较高,性能较高,是默认配置中,建议使用。(在系统突然宕机的情况下丢失1秒内的数据)
  • no由操作系统控制每次同步到 AOF 文件的周期,整体过程不可控。

不管是always还是everysec,都是redis调用系统的write函数方法来把缓冲区的数据刷到磁盘,而no的策略是依操作系统而定,有可能是缓冲区的数据满了或达到某一时间后,会自行地调用内核函数方法刷到磁盘上,但这种方式往往不可控,因为不知道要隔多久才会被刷到磁盘上,如果此时redis宕机了,丢失的就是缓冲区里的所有数据,这些数据是多长时间,多少,不知道。

AOF的相关配置

appendonly yes|no  #是否开启 AOF 持久化功能,默认为不开启状态 
appedsync always|everysec|no #AOF 写数据策略 
appendfilename filename #AOF 持久化文件名,默认文件名未 appendonly.aof,建议配置为 appendonly-端口号.aof


AOF的恢复流程

AOF的重写

随着命令不断地写入AOF,AOF的文件只会越来越大,为了解决这个问题,Redis引入了AOF的重写机制,用于压缩文件的体积,简单来说就是将同一数据的若干条指令简化为一条指令进行记录

AOF重写的作用

  • 降低磁盘占用量,提高磁盘的利用率
  • 降低持久化写的时间,提高持久化效率
  • 降低数据恢复用时,提高数据恢复效率

AOF重写配置如下

auto-aof-rewrite-percentage 100 //AOF文件距离上次文件增长超过多少百分比
auto-aof-rewrite-min-size 64mb //AOF文件体积最小多大以上触发

同时满足所设置的条件时,会自动触发 AOF 重写,此时 Redis 会扫描整个实例的数据,重新生成一个 AOF 文件来达到瘦身的效果。

当然我们也可以用手动方式来执行AOF的重写:bgrewriteaof

AOF的重写流程

  1. bgrewriteaof触发重写,判断是否存在save或bgsave正在执行,存在则等待执行结束再执行
  2. 主进程foak子进程,防止主进程阻塞而无法对外提供服务
  3. 子进程遍历Redis内存快照中数据写入临时AOF文件,同时会将新的写指令写入aof_buf各aof_rewrite_buf两个缓冲区,前者是为了写回旧的AOF文件,后者是为了后续刷新到临时AOF文件中,防止快照内存遍历时新的写入操作丢失
  4. 子进程结束临时AOF文件写入后,通知主进程
  5. 主进程会将上面的aof_rewrite_buf缓冲区的数据写入到子进程生成的临时AOF文件中
  6. 主进程使用临时AOF文件替换旧AOF文件,完成整个重写过程

三、混合

RDB与AOF的对比


优点

缺点

RDB

1、文件体积小:RDB 的文件内容是二进制格式,因此体积比实例内存小

2、恢复速度快

1、数据缺失:RDB 保存的是某一时刻的数据,当 Redis 实例某一时刻异常时,会导致数据丢失

2、消耗资源:RDB 文件的生成会消耗大量的 CPU 和内存资源,有一定代价

AOF

1、数据更完整:AOF 中是及时写入的方式,数据保存更完整。恢复时降低数据的损失。

2、易读性强:AOF 中保存的数据格式是客户端的写入命令,可读性性强。

1、文件体积大:AOF 中存储客户端所有的写命令,未经压缩,随着命令的写入,文件会越来越大。

2、增加磁盘IO:AOF 文件刷盘如果采用每秒刷一次的方式会导致磁盘IO升高,影响性能

结合着以上两种方式的优缺点,Redis4.0推出了一种混合型持久化方式,其实就是RDB与AOF的结合,吸收其优点,规避其缺点

持久化方式

通过 aof-use-rdb-preamble 参数来开启的。它的操作方式是这样的,在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以 AOF 的格式追加到文件中。这样既能保证数据恢复时的速度,同时又能减少数据丢失的风险。

文件恢复

在 Redis 重启时,先加载 RDB 的内容,然后再重放增量 AOF 格式命令。这样就避免了 AOF 持久化时的全量加载,从而使加载速率得到大幅提升。

总结

混合型的持久化似乎更符合我们的各个需求场景,但如果我们之前使用了4.0之前的版本,我双该如何选择呢?下面给一下参考吧,因为没有哪一个方案是完美的,一个技术选型,如果不考虑场景与业务,都是瞎搞。

1、综合的参数对比


RDB

AOF

占用存储空间

小(数据级:压缩)

大(指令级:重写)

存储速度

恢复速度

数据安全性

会丢失数据

依据策略而定

性能要求越高,数据丢失概率越大,丢失数据越多

资源消耗

高/重量级

低/轻量级

启动优先级

启动优先级解释: 如果两者都选择了情况下,重启 redis 服务器加载数据会先选择 AOF

2、对数据非常敏感, 建议使用默认的 AOF 持久化方案

(1)AOF持久化策略使用 everysec,每秒钟 fsync 一次。该策略下 redis 仍可以保持很好的处理性能, 当出现问题时,最多丢失0-1秒内的数据。

(2)注意:由于AOF文件存储体积较大,且恢复速度较慢

3、数据呈现阶段有效性,建议使用 RDB 持久化方案

(1)数据可以良好地做到阶段内无丢失(该阶段是开发者或运维人员手工维护的),且恢复速度较快,阶段点数据恢复通常采用 RDB 方案

(2)注意:利用 RDB 实现紧凑的数据持久化会使 Redis 效率降的很低

4、综合而言

a、RDB 与 AOF 的选择实际上是在做一种权衡,每种都有利有弊

b、如不能承受数分钟以内的数据丢失,对业务数据非常敏感, 选用 AOF

c、如能承受数分钟以内的数据丢失, 且追求大数据集的恢复速度, 选用 RDB

d、灾难恢复选用 RDB

e、双保险策略, 同时开启 RDB 和 AOF, 重启后, Redis 优先使用 AOF 来恢复数据,降低丢失数据的量

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: