当前位置: 首页 > news >正文

Redis02-持久化策略

目录

RDB(Redis DataBase Backup file)

RDB执行原理

AOF(Append-Only File)

RDB和AOF对比



Redis支持多种持久化方式,以确保数据在内存中持久存储,以便在Redis服务器重启时数据不会丢失。Redis中持久化的两种主要实现方式:RDB和AOF。

RDB(Redis DataBase Backup file)

RDB是Redis的快照持久化方式,它会在指定的时间间隔内生成数据快照并将其保存到磁盘上的一个文件中。RDB文件包含了数据库的数据和键的过期时间信息。RDB持久化是一个点对点的持久化方式,它适用于数据快照的定期备份,以及在Redis服务重启时快速恢复数据。

RDB持久化可以通过配置文件设置,允许管理员指定快照的保存频率和文件名。RDB文件通常以二进制格式存储,可以通过SAVEBGSAVE命令手动触发持久化。

[root@10 ~]# redis-cli -h 127.0.0.1 -p 6379 -a 'password' #用密码方式连接
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> save  #由Redis主进程执行RDB,会阻塞所有命令
OK
127.0.0.1:6379> bgsave  #开启子进程执行RDB,避免主线程受影响
Background saving started
127.0.0.1:6379> 

Redis内部有触发RDB的机制,在redis.conf文件中:

# Save the DB to disk.
#
# save <seconds> <changes>
#
# Redis will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# Snapshotting can be completely disabled with a single empty string argument
# as in following example:
#
# save ""
#
# Unless specified otherwise, by default Redis will save the DB:
#   * After 3600 seconds (an hour) if at least 1 key changed
#   * After 300 seconds (5 minutes) if at least 100 keys changed
#   * After 60 seconds if at least 10000 keys changed
#
# You can set these explicitly by uncommenting the three following lines.
#
# save 3600 1
# save 300 100
# save 60 10000

说明一下:

# save "" 这是禁用RDB
save 3600 1 # 表示每小时有至少1个key发生变化,就执行bgsave
save 300 100 # 表示每5分钟有至少100个key发生变化,就执行bgsave
save 60 10000 # 表示每1分钟有至少10000个key发生变化,就执行bgsave
RDB执行原理
  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程)。

  2. 父进程接收处理客户端命令,子进程将内存中的数据写入硬盘中的临时文件。

  3. 当子进程写入完所有数据后,使用临时文件替换旧的RDB文件,至此一次快照操作完成。

需要注意的是:

  • 页表:记录虚拟地址与物理地址的映射关系(操作系统:用户空间程序只能访问虚拟内存,而不是直接操作物理内存)。

  • Fork采用的是一种copy-on-write的策略,目的是防止数组脏写:

    • 父进程读数据时共享读取

    • 父进程写数据是拷贝副本单独写操作

  • 在最近一次RDB和下一次RDB间隔期间出现Redis服务宕机,是会丢失这批数据的。

Redis启动后会读取RDB文件,文件是压缩过的二进制格式。占用空间小,利于传输和恢复。读取的时间根据服务器性能、数据结构、数据量大小会有不同差异。通常一个记录1000万个字符串类型键、大小为1GB的快照文件载入内存需要花费20-30秒。

RDB实现持久化,一旦出现异常退出,恢复的时候只能恢复到最近一次RDB的节点数据。如果数据比较重要,希望将损失降到最小,那么可以使用AOF进行持久化。

AOF(Append-Only File)

AOF是Redis的追加日志持久化方式,它将每个写操作(包括SET、INCR等)追加到一个日志文件中,以记录数据库操作的历史。AOF文件包含了一系列命令,它们可以用于重建数据库状态。

AOF持久化可以通过配置文件设置,可以选择以同步(fsync)或异步(no fsync)方式将操作追加到AOF文件中。同步方式可以保证数据的完整性,但通常会降低性能。异步方式则更快,但在发生故障时可能会导致数据丢失。

AOF默认是关闭的,在redis.conf文件进行设置:

# 是否开启AOF,默认是no
appendonly yes 
# AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率(也叫刷盘策略)是可以通过redis.conf配置的:

# appendfsync always 表示每执行一次写命令,立即记录到AOF文件 
appendfsync everysec # 推荐的,也是默认的每秒刷盘策略
# appendfsync no 表示写命令执行完先放到AOF缓冲区,由操作系统决定何时将缓冲区内容写入磁盘
配置项刷盘时机优点缺点
Always同步刷盘可靠性高,几乎不丢数据性能影响大
everysec每秒刷盘性能适中最多丢失1秒数据
no操作系统控制性能最好可靠性较差,可能丢失大量数据

由于AOF记录的是写命令,文件比RDB大的多。而且AOF会记录对同一个key的多次操作,但只有最后一次写操作才有意义。我们可以通过bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同的结果。

AOF也会在触发阈值时自动重写AOF文件。阈值可以在redis.cof配置:

# AOF文件比上次增长超过多少百分比触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积达到多少触发重写
auto-aof-rewrite-min-size 64mb
RDB和AOF对比
** **RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积很大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如AOF高,因为数据完整性更高
系统资源占用高,大量CPU和内存消耗低,主要是磁盘IO资源但AOF重写时会占用大量CPU和内存资源
使用场景可以容忍数分钟的数据丢失,追求更快的启动速度对数据安全性要求较高常见

两者各有优缺点,而实际的项目中往往是结合一起使用的,以提供更可靠的数据保护。在Redis重启时,会优先使用AOF日志文件来恢复数据,因为AOF记录了更详细的操作历史。如果AOF文件不存在或损坏,Redis可以使用RDB文件来进行数据恢复。

相关文章:

  • 公司团建小游戏开发小程序游戏互动小游戏
  • RK356X Android13.0 HDMI和喇叭同时出声音
  • 算法整理合集
  • R语言 复习 习题图片
  • Java 数据结构篇-实现单链表核心API
  • NOIP2023模拟12联测33 滈葕
  • 初阶JavaEE(14)表白墙程序
  • OpenCV官方教程中文版 —— 图像修复
  • ViT模型中的tokens和patches概念辨析
  • 86.Linux系统下复制进程fork(逻辑地址和物理地址)
  • Scala语言用Selenium库写一个爬虫模版
  • 【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成
  • python-全自动二维码识别
  • ST7789LCD调试笔记
  • superset study day01 (本地启动superset项目)
  • angular组件开发
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Python_网络编程
  • 回顾2016
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用common-codec进行md5加密
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 自制字幕遮挡器
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # C++之functional库用法整理
  • #Z0458. 树的中心2
  • (function(){})()的分步解析
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)linux下的时间函数使用
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net IE10 _doPostBack 未定义
  • .NET 的程序集加载上下文
  • .netcore 获取appsettings
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net和php怎么连接,php和apache之间如何连接
  • .sys文件乱码_python vscode输出乱码
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [20190113]四校联考
  • [BT]BUUCTF刷题第9天(3.27)
  • [C++]——带你学习类和对象
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [iOS]随机生成UUID通用唯一识别码
  • [Java、Android面试]_10_Java中==与equal()方法的区别?重写equal()方法?