1、引言

Redis作为一种高性能的内存数据存储系统,常被用作缓存、会话存储、消息队列等多种应用场景。然而,由于其数据存储在内存中,一旦发生意外或服务器重启,数据就会丢失。为了保障数据的持久性和安全性。

Redis提供了多种持久化方案:

  • RDB(Redis DataBase):按指定的时间间隔执行数据集的时间点快照。
  • AOF(Append Only File):记录服务器收到的每个写入操作。
  • RDB + AOF:您还可以在同一实例中组合 AOF 和 RDB。

本文将探究以上三种持久化技术的工作原理、优缺点以及适用场景。

2、RDB持久化

RDB是Redis的默认持久化方式。它通过定期或手动执行快照将内存中的数据保存到磁盘上(dump.rdb)。触发RDB持久化过程分为手动触发和自动触发。

  • 手动触发:可通过SAVE和BGSAVE命令完成。
  • 自动触发:通过redis.conf文件增加save配置项完成,本质还是执行得BGSAVE命令。

那么SAVE和BGSAVE两个命令有什么区别呢?

SAVE:主线程操作,同步执行,会阻塞其它命令的执行。执行[save]命令时,RDB快照生成如果时间过长,后续请求会被阻塞,客户端新发送所有命令都会被拒绝。因此在生产环境中要谨慎使用该命令,避免影响服务的正常运行。

BGSAVE:写时复制,异步执行,不会阻塞其它命令的执行,会fork一个子进程进行操作,但这样比较消耗内存。主进程依旧保持与客户端的连接,正常执行读写命令。

2.1、手动触发

SAVE命令使用方法:

127.0.0.1:6379> SAVE

BGSAVE使用方法:

127.0.0.1:6379> BGSAVE

2.2、自动触发

RDB自动触发指的是通过在Redis的配置文件中设置特定的条件,使得Redis能够在满足这些条件时自动进行RDB持久化,而无需手动干预。这样可以确保数据定期地被保存到磁盘上,从而避免过多的数据丢失。

在Redis的配置文件redis.conf中,可以使用save配置项来设置RDB自动触发的条件。

save <seconds> <changes>

其中<seconds>表示多少秒内发生了<changes>次写操作,就会触发一次自动的RDB持久化。

可以设置多个save规则,每个规则独占一行,Redis会按照配置的顺序进行判断。例如:

save 900 1
save 300 10
save 60 10000

上述配置的意思分别是:在900秒内发生了至少1次写操作、在300秒内发生了至少10次写操作、在60秒内发生了至少10000次写操作时,Redis会自动触发RDB持久化。

3、AOF持久化

AOF持久化(Append Only File)以追加日志的形式记录Redis每个写操作并写入到一个文件中,即【appendonly.aof】文件。

AOF持久化过程可以简述如下:

  1. 写入操作记录:当Redis执行写操作时(如SET、INCR等),写入命令会追加到aof_buff(缓冲区)中。

  2. 文件同步:AOF缓冲区会根据配置定期进行同步到磁盘。

  3. AOF重写:为了避免AOF文件过大,Redis会定期进行AOF重写,达到压缩文件得目的。

3.1、触发方式

在redis.conf配置文件中,开启配置(默认不开启):

appendonly yes

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

持久化频率配置:

appendfsync always    # 每个写命令都同步,新的命令追加到aof文件,慢但安全

appendfsync everysec  # 每秒同步一次,丢失概率小

appendfsync no        # 从不主动同步,交给操作系统决定何时同步

3.2、AOF重写

当满足触发条件时,Redis会扫描整个实例的数据,重新生成一个AOF文件来完成一些多余命令的过滤,从而削减了文件大小。

重写流程:主进程fork出一个子进程进行AOF文件的重写,子进程重写完毕后,主进程把子进程重写期间,其他客户端产生的写请求,追加到AOF文件中,替换旧文件。

重写是如何缩减文件大小的,如:

  • 进程内已经超时的数据不再写入文件。
  • 旧的AOF文件含有无效命令,如del key1、hdel key2等。重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。
  • 多条写命令可以合并为一个。

AOF有两种触发方式:

  • 手动触发:直接调用bgrewriteaof命令。
  • 自动触发:redis.config配置如下
auto-aof-rewrite-percentage 100    # 百分比,AOF文件的增长率达到

auto-aof-rewrite-min-size 64mb     # AOF文件大小达到多少

上述配置的含义是,当AOF文件大小增长到当前AOF文件大小的100%时,Redis会自动触发AOF重写操作;同时,AOF文件大小至少达到64MB时,才会执行AOF重写。

4、混合持久化

在Redis4.0后新增了一种混合模式:RDB+AOF,将两者的优点进行整合,混合方式采用AOF方式记录数据的变化,采用RDB的方式进行二进制文件存储。也就是在写入的时候先把数据以RDB的形式写入文件的开头,再将后续的写命令以AOF格式追加到文件中。

redis.conf开启配置如下:

# 混合持久化开关
aof-use-rdb-preamble yes

5、RDB与AOF的优缺点对比

5.1、RDB

优点:

  • 性能高:对Redis的性能影响较小,适用于要求高性能的场景。
  • 适用于备份:生成的快照文件紧凑且压缩,适合用于备份和灾难恢复。

缺点:

  • 数据丢失:定期生成快照,如果Redis发生故障,最后一次快照后的数据会丢失。
  • 不适用于大规模数据:对于大规模数据集,可能导致长时间阻塞。

5.2、AOF

优点:

  • 更高的数据安全性:记录每个写操作,数据更可靠,适用于要求数据实时持久性的场景。
  • 数据可读性:AOF文件以易读的文本格式记录,方便查看和理解。

缺点:

  • 相同数据集的数据而言AOF文件要远大于RDB文件,恢复速度慢于RDB
  • AOF文件较大:随着写操作的增加,AOF文件会变得庞大。

综合来看,对于不同的应用场景,可以根据需求选择适合的持久化方式。RDB持久化适用于要求高性能和定期备份的场景;AOF持久化适用于要求数据实时持久性和较高数据安全性的场景;混合持久化则可以在兼顾数据实时性和备份需求的同时,提供更好的性能和数据保护。在配置持久化时,建议根据具体业务需求,综合考虑数据安全性、性能、存储空间等因素,选择合适的持久化策略。

Redis从入门到放弃(6):持久化的更多相关文章

  1. Redis 从入门到放弃

    Redis 从入门到放弃 http://www.iocoder.cn/Fight/Redis-went-from-getting-started-to-quitting/

  2. redis从入门到放弃 -> 部署方案

    单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...

  3. redis从入门到放弃 -> 简介&概念

    一.redis简介 Redis是一款开源的.高性能的键-值存储.它常被称作是一款数据结构服务器. 当值支持的主要数据类型为:字符串(strings)类型,括哈希(hashes).列表(lists).集 ...

  4. Redis——从入门到放弃

    redis简介 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, ...

  5. OpenStack从入门到放弃

    OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...

  6. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  7. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃

    一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...

  8. Redis快速入门:安装、配置和操作

    本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...

  9. 超强、超详细Redis数据库入门教程(转载)

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下   [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...

  10. Redis从入门到精通:初级篇

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

随机推荐

  1. websocket多实例推送解决方案-数据实时展示

    需求 需要前端展示实时的订单数据信息.如下图所示,实时下单实时页面统计更新展示 思路方案 前端使用websocket 建立通信 后端监听数据库的binglog变更,实时得到最新数据,推送到前端 现状及 ...

  2. IIS6网站批量迁移至IIS7经验分享

    迁移原因:公司服务器更换 迁移环境:源服务器 windows2003 X86   IIS6        目标服务器:windows2008 X64  IIS7 迁移过程: 第一次迁移失败,作为简要记 ...

  3. #Python基础 DateFrame 查看数据信息

    一:导入案例数据及X-MIND 二:实例 2.1 显示摘要信息 2.2显示描述性统计信息 2.3显示 前后n行 2.4显示索引.列信息 2.5显示每列的数据类型

  4. 2021-04-15:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中,字典序最小的结果。

    2021-04-15:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中,字典序最小的结果. 福大大 答案2021-04-15: "b"和&q ...

  5. 2021-07-04:股票问题1。给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择某一天 买入这只股票,并选择在未来的某一个不同的日子

    2021-07-04:股票问题1.给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格.你只能选择某一天 买入这只股票,并选择在未来的某一个不同的日子 ...

  6. 2021-07-21:一张扑克有3个属性,每种属性有3种值(A、B、C),比如“AAA“,第一个属性值A,第二个属性值A,第三个属性值A,比如“BCA“,第一个属性值B,第二个属性值C,第三个属性值A

    2021-07-21:一张扑克有3个属性,每种属性有3种值(A.B.C),比如"AAA",第一个属性值A,第二个属性值A,第三个属性值A,比如"BCA",第一个 ...

  7. HNU2019 Summer Training 3 E. Blurred Pictures

    E. Blurred Pictures time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. 运行和编译时期资源加载的不同【vue】

    开发语言都有编译和运行两个阶段,很多时候这个也会带来许多bug 如:一个项目在开发阶段测试没有问题,然上线发布后就会有这样那样的问题,譬如说图片的加载,静态数据(js,css,json)读取错误 一 ...

  9. vue/cli3整合Cesium,加载离线arcgis 切片

    最開始使用webpack進行cesium 集成, 出现了问题一大堆,最后只好选择传统的方法直接引入了,具体操作如下 目录 一.安装cesium 二.使用script引用cesium 1.切换到 nod ...

  10. bootstrap treeview基本运用

    虽然现在有了很多新的前端框架,但是有的时候我们做一个不需要任何其他js编译环境就可以运行的项目,那还是的使用一些老式技术,接下来就来回顾一些bootstrap treeview + jquery的使用 ...