热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

redis(三)redis持久化

目录持久化方式RDBRDB工作机制保存策略RDB属性设置触发持久化的方式优缺点AOF保存策略AOF属性设置AOF文件的修复AOF的rewrite机制优缺点应用场景持久化方式redi

目录



  • 持久化方式

  • RDB

    • RDB工作机制

    • 保存策略

    • RDB属性设置

    • 触发持久化的方式

    • 优缺点



  • AOF

    • 保存策略

    • AOF属性设置

    • AOF文件的修复

    • AOF的rewrite机制

    • 优缺点



  • 应用场景


持久化方式

redis主要工作在内存中。内存本省就不是一个持久化的设备,断电后数据会清空。但是redis提供了持久化方式。个人看来 这是redis提供了一种备份机制,可以将内存中的数据持久化到磁盘上,有利于这些热点数据的备份恢复和迁移。

redis提供了两种持久化方式,分别是RDB 和AOF

RDB持久化方式能够在指定的时间间隔对数据进行快照存储

AOF持久化方式记录每次对服务器的写操作,当服务器重启的时候会重新执行这些命令来恢复原始数据,个人认为类似于MySQL的binlog日志


RDB

RDB:在指定的时间间隔内将内存中的数据写入磁盘,它恢复时是将文件读取到内存中。

RDB是默认开启的


RDB工作机制

工作机制:每隔一段时间,就会把内存中的数据保存到硬盘上的指定文件中。

RDB在持久化时会单独创建一个fork子进程来进行持久化操作,会先将数据写入到一个临时文件中,等到持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。

整个过程中,主进程work是不会进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模的数据恢复,RDB性能比AOF好很多。


保存策略

save 900 1 900 秒(15分钟)内如果至少有 1 个 key 的值变化,则保存

save 300 10 300 秒(5分钟)内如果至少有 10 个 key 的值变化,则保存

save 60 10000 60 秒(1分钟)内如果至少有 10000 个 key 的值变化,则保存

save "" 是禁用RDB模式


RDB属性设置










































属性含义默认
save保存策略默认开启三个 也就是15分钟1个key则保存
dbfilenameRDB 快照文件名dump.rdb
dirRDB 快照保存的目录必须是一个目录,不能是文件名。最好改为固定目录。默 认为./代表执行 redis-server 命令时的当前目录!
stop-writes-on-bgsave-error是否在备份出错时,继续接受写 操作如果用户开启了 RDB 快照功能,那么在 redis 持久化数据 到磁盘时如果出现失败,默认情况下,redis 会停止接受所 有的写请求
rdbcompression对于存储到磁盘中的快照,可以 设置是否进行压缩存储。如果是的话,redis 会采用 LZF 算法进行压缩。如果你 不想消耗 CPU 来进行压缩的话, 可以设置为关闭此功能,但是存储在磁盘上的快照会 比较大。
rdbchecksum是否进行数据校验在存储快照后,我们还可以让 redis 使用 CRC64 算法 来进行数据校验,但是这样做会增加大约 10%的性能消耗, 如果希望获取到最大的性能提升,可以关闭此功能。

触发持久化的方式

1、基于自动保存策略

2、执行save,或者bgsave命令,执行时save时是阻塞状态

3、执行 shutdown 命令时,也会主动地备份数据。

4、执行 flushdb 命令,也会产生 dump.rdb,但里面是空的,没有意义


优缺点

优点

1、RDB是一个文件,保存了某个时间点的数据集,非常适合用于数据集的备份。

2、压缩格式 恢复速度快

缺点

1、(可能有 但是我没找到)没有设置固定大小的策略,随着业务量的增加 只能任由rdb文件增大

2、不是实时的,可能会丢数据,操作比较重。

3、fork时内存中的数据被克隆了一份,大概2倍的膨胀。

在这里插入图片描述

备份脚本

每小时备份一次rdb文件
crontab -e
0 */1 * * * cp /etc/redis/dump.rdb /etc/redis/dump.rdb`date +%Y%m%d%H`

AOF

1、AOF是以日志的形式来记录每个写操作,将每一次对数据进行修改,都会把新建、修改数据的命令保存到指定文件中。redis重新启动时读取这个文件,重新执行新建、修改数据的命令恢复数据。

2、默认不开启,需要手动启动

3、AOF 在保存命令的时候,只会保存对数据有修改的命令,也就是写操作!

4、当 RDB 和 AOF 存的不一致的情况下,按照 AOF 来恢复。因为 AOF 是对 RDB 的补充。备份周期更短,也就更可靠。


保存策略

appendfsync always:每次产生一条新的修改数据的命令都执行保存操作;效率低,但是安全!

appendfsync everysec:每秒执行一次保存操作。如果在未保存当前秒内操作时发生了断电,仍然会导致一部分数据丢失(即 1 秒钟的数据)。

appendfsync no:从不保存,将数据交给操作系统来处理。更快,也更不安全的选择。推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。


AOF属性设置















































属性含义默认
appendonly是否开启 AOF 功能默认是关闭的
appendfilenameAOF 文件名称
appendfsyncAOF 保存策略官方建议 everysec
no-appendfsync-on-rewrite在重写时,是否执行保存策略执行重写,可以节省 AOF 文件的体积;而且在恢复的时候 效率也更高。
auto-aof-rewrite-percentage重写的触发条件当目前 aof 文件大小超过上一次重写的 aof 文件大小的百分 之多少进行重写
auto-aof-rewrite-min-size设置允许重写的最小 aof 文件 大小避免了达到约定百分比但尺寸仍然很小的情况还要重写
aof-load-truncated截断设置如果选择的是 yes,当截断的 aof 文件被导入的时候,会自 动发布一个 log 给客户端然后 load

AOF文件的修复

如果 AOF 文件中出现了残余命令,会导致服务器无法重启。此时需要借助 redis-check-aof 工具来修复!

命令: redis-check-aof –fix 文件


AOF的rewrite机制

AOF采用文件追加方式,文件会越来越大,为了避免出现这种情况,新增加了重写机制,当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。可以使用命令bgrewriteaof

重写原理

AOF文件持续增长而过大时,会fork出一条新进程来将文件重新(也就是先写临时文件最后rename),遍历新进程的内存中数据,每条记录有一条set语句。重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件,这点和RDB快照相似。

触发机制

redis会记录上次重写时AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大小大于64M时触发。


优缺点



1、备份机制更稳健,丢数据概率更低

2、可读的日志文本,通过操作AOF文件,可以处理误操作。



1、比起RDB占用更多的磁盘空间

2、恢复备份速度要慢

3、每次读写都同步的话,有一定的性能压力

两种备份方式的有优先级

如果同时开启两种持久化方式:

在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

RDB的数据不是实时的,同时使用两者时服务器重启也只会找AOF文件。那要不要只用AOF呢?

也不建议,因为RDB更适合备份数据库,进行快速重启。


应用场景

一、服务器卡死或者redis卡死

如果数据不是很重要 建议直接使用RDB恢复。

恢复步骤:

1、移动AOF文件(因为默认是从AOF文件reload)

2、检查RDB文件 进行redis restart 重新reload RDB文件

二、人为误删除部分数据

数据不重要:删除了就删除吧

数据重要:AOF恢复

三、人为误删除全部数据

数据不重要:使用crontab 定时备份任务 备份的RDB文件进行恢复

数据重要:使用AOF的方式,vim appendonly.aof文件,将flushall命令删除后进行重启redis

四、误删除AOF文件

误删除了 就是没了。只能从现在再开始记录。

五、误删除RDB文件

save \bgsave触发条件会再次自动生成dump.rdb 是无所谓的

因为你不会,所以你才会---大司马



推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 随着Redis功能的不断增强和稳定性提升,其应用范围日益广泛,成为软件开发人员不可或缺的技能之一。本文将深入探讨Redis集群的部署与优化,包括主从备份机制、哨兵模式以及集群功能,帮助读者全面理解并掌握Redis集群的应用。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 在API测试中,我们常常需要通过大量不同的数据集(包括正常和异常情况)来验证同一个接口。如果为每种场景单独编写测试用例,不仅繁琐而且效率低下。采用数据驱动的方式可以有效简化这一过程。本文将详细介绍如何利用CSV文件进行数据驱动的API测试。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
author-avatar
Mayuki命_103
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有