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

Redis持久化机制

Redis为什么数据要持久化?

Redis是内存数据库,如果数据不进行持久化,一旦Redis服务器重启数据会全部丢失。

注意:如果Redis只做缓存,你也可以不使用任何持久化方式。

什么是Redis数据持久化

把数据存储到硬盘中,当服务器开启的时候再读入到内存中去,这就是redis数据的持久化。

Redis提供两种持久化机制:RDB 和 AOF

注意:修改的redis的配置文件,要重启redis才能生效。

RDB(默认机制)

在一段时间内,检测key的变化情况,然后持久化某一个时刻数据(快照)【对性能影响低,推荐使用】

 # 900秒修改key 1次,会触发rdb机制
 save 900 1
 # 300秒修改key 10次,会触发rdb机制
 save 300 10
 # 60秒修改key 1000次,会触发rdb机制
 save 60 10000

每次触发save,就会把当前时刻的数据记录到dump.rdb文件中(快照)

rdb机制触发的时机

  • save的规则满足的情况下,会自动触发rdb机制

  • 执行flushall命令,也会触发我们的rdb机制,但里面是空的,无意义

  • 关闭redis服务器(使用 shutdown指令 ),也会触发我们的rdb机制

  • save/bgsave指令会执行,save用主进程持久化,效率低(同步),不使用,gbsave用子进程持久化(异步)

持久化执行过程

Redis会fork一个子进程进行持久化,先将数据写到临时文件(dump.rdb)中,待持久化过程结束,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。

数据恢复

只需要把dump.rdb放在redis的启动目录即可,redis启动时,会自动检查dump.rdb文件,恢复数据。

生产环境我们会对dump.rdb文件进行备份。

rdb文件名称

# The filename where to dump the DB
dbfilename dump.rdb

优点

  • 适合大规模的数据恢复。
  • 对数据的完整性要求不高。
  • 持久化的整个过程中,主进程不进行任何IO操作,这就确保了极高的性能。

缺点

  • fork子进程会占用一定的内存空间。
  • redis意外宕机,还没触发save,最后一次修改的数据就没了(不能保证数据不丢失)。

AOF

以日志的方式把所有写的操作都记录到文件中(无限追加写入)

恢复数据时,把这个文件中所有的写操作再执行一遍。

开启aof

 # 开启aof,默认不开启的
 # appendonly no 
 appendonly yes

持久化策略

# appendfsync always  每一次操作都 sync(同步),性能影响严重
appendfsync everysec  # 每秒执行一次 sync,可能会丢失这1s的数据(默认)
# appendfsync no # 不执行 sync,这个时候操作系统自己同步数据,速度最快

AOF是没有fork子进程的,使用主进程进行的持久化。

文件名称

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

redis-check-aof工具

如果aof文件有错误,redis是启动不起来的,我需要修改这个aof文件

redis给我们提供了一个工具redis-check-aof,执行指令来修复aof文件

redis-check-aof --fix appendonly.aof

优点

  • 每一次修改都同步,文件的完整性更好,
  • 每一秒同步一次,可能会丢失一秒的数据,
  • 从不同步,效率最高

缺点

  • aof文件大小远远大于rdb,修复速度也比rdb慢,aof运行效率比rdb慢

RDB和AOF的对比

对于大规模恢复数据,且对数据恢复的完整性不是非常敏感,那RDB要比AOF更加高效。

AOF数据的安全性更好,但效率低

两种持久化机制同时开启,优先使用aof机制。

相关文章:

  • 大数据随记 —— DataFrame 与 RDD 之间的相互转换
  • React 学习笔记 2022-08
  • 【实用工具系列之爬虫】python爬取资讯数据
  • 易基因|植物育种:ChIP-seq(组蛋白)揭示H3K36me修饰影响温度诱导的植物可变剪接和开花
  • java计算机毕业设计计算机组成原理教学演示软件源码+数据库+系统+lw文档+mybatis+运行部署
  • Elasticsearch:简体繁体转换分词器 - STConvert analysis
  • C语言经典算法实例1:求二维数组最大最小值
  • 【C++入门基础】命名空间 | 缺省参数 | 函数重载 | 引用 | 内联函数
  • VMware安装与配置Linux 虚拟机
  • Code For Better 谷歌开发者之声——我与Android同成长
  • 【深度学习】(五)目标检测——下篇
  • web前端面试高频考点——Vue3.0新增API(生命周期,ref、toRef 和 toRefs 的理解和最佳使用方式)
  • 管理经济学--重点
  • Java学习路线(个人学习总结)
  • 【数据结构】跳表SkipList代码解析(C++)
  • Consul Config 使用Git做版本控制的实现
  • Fastjson的基本使用方法大全
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTTP请求重发
  • idea + plantuml 画流程图
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Node项目之评分系统(二)- 数据库设计
  • php面试题 汇集2
  • python 学习笔记 - Queue Pipes,进程间通讯
  • redis学习笔记(三):列表、集合、有序集合
  • scala基础语法(二)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 彻底搞懂浏览器Event-loop
  • 如何设计一个微型分布式架构?
  • 十年未变!安全,谁之责?(下)
  • AI算硅基生命吗,为什么?
  • scrapy中间件源码分析及常用中间件大全
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #100天计划# 2013年9月29日
  • #if和#ifdef区别
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (07)Hive——窗口函数详解
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (arch)linux 转换文件编码格式
  • (C++20) consteval立即函数
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .libPaths()设置包加载目录