Redis——缓存的持久化
1、持久化机制
Redis的所有数据都保存在内存中,如果没有配置持久化功能,Redis重启后数据就会全部丢失,所以需要开启Redis的持久化功能,将数据保存到磁盘上,这样当Redis重启后,可以从磁盘中恢复数据。Redis提供两种方式进行持久化,一种是RDB持久化,另一种是AOF持久化。下面详细介绍这两种方式。
1.1、RDB持久化
RDB持久化是指在指定的时间间隔内定时地将内存中的数据写入磁盘,把内存中的数据保存到RDB文件中,是默认的持久化方式。Redis快照的过程是,首先Redis服务器使用fork函数复制一份当前进程(父进程)的副本(子进程)。然后,父进程继续接收并处理客户端发来的命令,而子进程将内存中的数据写入硬盘中的RDB临时文件。最后,当子进程写入完所有数据后会用RDB临时文件替换旧的RDB文件,如下图所示:

1.2、AOF持久化
追加(Append Only File,AOF)持久化方式会记录Redis客户端对服务器的每一次写操作命令,并将这些写操作追加保存到appendonly.aof文件(AOF文件)中。在Redis服务器重启时,会加载并运行AOF文件里的命令,以达到恢复数据的目的,如下图所示:

1.3、配置RDB
Redis的配置文件在Linux下是redis.conf文件,在Windows下是redis.windows.conf文件。本小节使用的实验环境是Linux,相应的配置文件是redis.conf文件,配置效果与Windows下的一致。
1.3.1、RDB文件路径和名称
RDB持久化是Redis默认的持久化方式,默认情况下Redis会把快照文件存储在当前目录下一个名为dump.rdb的文件内。
如果需要修改dump.rdb文件的存储路径和名称,可以通过修改配置文件redis.conf内的dbfilename参数和dir参数来实现:
# RDB文件名,默认为dump.rdb
dbfilename dump.rdb # RDB文件和AOF文件存放的目录。默认为当前工作目录
dir /usr/local/redis/bin
保存配置文件后,使用redis-server命令加载redis.conf配置文件并重新启动Redis服务器,然后使用CONFIG GET dir命令查看RDB文件的存储路径:
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"
1.3.2、RDB的保存点
修改保存点选项,可以配置RDB的启用和禁用。可以通过修改配置文件redis.conf实现该功能。
(1)设置保存点,可以使Redis在每N秒内,如果数据发生了M次改变就保存快照文件。例如,下面这个保存点配置表示每60s内,如果数据发生了10000次以上的改变,Redis就会自动保存快照文件:
save 60 10000
保存点可以设置多个,设置保存点的格式如下:
save <seconds> <changes>
Redis可以设置多个保存点,例如Redis的配置文件redis.conf就默认设置了3个保存点:
save 900 1 # 900s后至少1个key有改变,就保存快照文件
save 300 10 # 300s后至少10个key有改变,就保存快照文件
save 60 10000 # 60s后至少10000个key有改变,就保存快照文件
(2)禁用快照保存。如果想禁用快照保存的功能,可以通过注释所有save配置,或者在最后一条save配置后添加如下的配置实现:
save ""
1.3.3、错误处理
后台存储发生错误时禁止写入,默认值为yes。默认情况下,如果Redis在后台生成快照文件时失败,就会停止接收数据,目的是让用户能知道数据没有持久化成功:
stop-writes-on-bgsave-error yes
1.3.4、数据压缩
启动RDB文件压缩,会耗费CPU资源,默认值为yes。如果想节省CPU资源,可以禁用压缩功能,但是数据集就会比没压缩的时候要大。
rdbcompression yes
1.3.5、数据校验
对RDB数据进行校验,会耗费CPU资源,默认值为yes。
rdbchecksum yes
1.3.6、手动生成快照文件
Redis提供了SAVE命令和BGSAVE命令用于手动生成快照文件。
(1)SAVE。SAVE命令会使用同步的方式生成RDB快照文件,将当前Redis实例的所有数据快照(Snap Shot)以RDB文件的形式保存到硬盘,默认情况下会把Redis数据持久化到dump.rdb文件中,并且在Redis服务器重启后自动读取dump.rdb文件。SAVE命令在Redis主线程中工作,会阻塞其他请求操作,在实际的生产环境中应该避免使用。
127.0.0.1:6379> SAVE
OK
(2)BGSAVE。BGSAVE命令使用异步的方式保存当前Redis实例的所有数据快照到RDB文件,执行BGSAVE命令后,Redis会产生一个子进程并立刻恢复对客户端的服务。
127.0.0.1:6379> BGSAVE
Background saving started
(2.41s)
注意Redis配置文件里禁用了快照生成功能不影响SAVE命令和BGSAVE命令的效果。
1.4、配置AOF
1.4.1、启用AOF持久化
将redis.conf配置文件的配置项appendonly设置为yes,启用AOF持久化:
appendonly yes
修改redis.conf配置文件后,重启Redis服务器,Redis执行的每一条命令都会被记录到appendonly.aof文件中。但事实上,Redis并不会立即将命令写入硬盘文件中,而是将命令写入硬盘缓存。在接下来的可靠性配置中,可以配置从硬盘缓存写入硬盘的时间。
1.4.2、AOF文件路径和名称
通过修改配置文件redis.conf,修改dir、appendfilename对应的配置项来修改AOF文件路径和名称:
# 文件存放目录,与RDB文件共用。默认为当前工作目录
dir /usr/local/redis # 默认文件名为appendonly.aof
appendfilename "appendonly.aof"
1.4.3、可靠性
在redis.conf配置文件中可以通过appendfsync选项指定写入策略,有3个选项:
- always:每次收到Redis客户端的写命令就立即强制写入到AOF文件。这是最有保证的持久化方式,但也是速度最慢的,一般不推荐使用。
- everysec:每秒向AOF文件写入一次Redis客户端的写操作。在性能和持久化方面做了很好的折中,是推荐的方式。
- no:由操作系统来决定什么时候写入AOF文件,一般为30秒左右一次。这个方式性能最好,但是持久化方面没有保证,一般不推荐使用。
在redis.conf配置文件中配置appendfsync选项的实例如下:
# appendfsync always
appendfsync everysec
# appendfsync no
1.4.4、日志重写
随着写操作不断增加,AOF文件会越来越大,Redis可以在不中断服务的情况下在后台重建AOF文件。
日志重写的工作原理如下:
- Redis调用fork函数,产生一个子进程。
- 子进程把新的AOF文件写到一个临时文件里。
- 父进程持续把新的变动写到内存里的缓冲区(buffer),同时也会把这些新的变动写到旧的AOF文件里,这样即使重写失败也能保证数据的安全。
- 当子进程完成文件的重写后,父进程会获得一个信号,然后把内存里的缓冲区内容追加到子进程生成的新AOF文件里。
我们可以设置日志重写的条件。下面的实例表示当AOF文件的体积大于64 MB,并且AOF文件的体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行日志重写操作:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64MB
Redis会记住自从上一次重写后AOF文件的大小。要禁用自动的日志重写功能,可以把百分比设置为0:
auto-aof-rewrite-percentage 0
1.4.5、数据损坏修复
如果因为某些原因(例如服务器崩溃)AOF文件损坏了,导致Redis加载不了,可以通过以下方式进行修复:
- 备份AOF文件。
- 使用redis-check-aof命令修复原始的AOF文件:
redis-check-aof --fix - 在Linux下可以使用diff-u命令查看AOF文件和RDB文件的差异。
- 使用修复过的AOF文件重启Redis服务器。
1.4.6、从RDB切换到AOF
在Redis 2.2以后的版本中,从RDB切换到AOF,需要备份一个最新的dump.rdb文件,并把备份文件放在一个安全的地方。执行以下命令:
$ redis-cli config set appendonly yes
$ redis-cli config set save ""
要确保数据与切换前一致,确保数据正确地写到AOF文件里。
1.4.7、备份
建议的备份方法如下:
- 创建一个定时任务,每小时和每天创建一个快照文件,并将快照文件保存在不同的文件夹里。
- 定时任务运行时,把太旧的文件删除。例如只保留48h内的按小时创建的快照文件和一到两个月的按天创建的快照文件。
- 每天确保一次把快照文件传输到数据中心外的地方进行保存,至少不能保存在Redis服务所在的服务器。
2、Redis过期key清除策略
Redis对过期key有3种清除策略:
- 被动清除:当读/写一个已经过期的key时,会触发惰性清除策略,直接清除这个过期key。
- 主动清除:由于惰性清除策略无法保证冷数据被及时清除,因此Redis会定期主动清除一批已过期的key。
- 当前已用内存超过maxmemory限定时,触发主动清除策略。
这里着重介绍第3种清除策略。在Redis中,允许用户设置最大使用内存大小为maxmemory(需要配合maxmemory-policy使用),设置为0表示不限制。当Redis内存数据集快到达maxmemory时,Redis会实行数据淘汰策略。Redis提供6种数据淘汰策略,如小表所示:

关于maxmemory设置,可以通过在redis.conf配置文件中的maxmemory参数设置,或者通过命令CONFIG SET动态修改。关于数据淘汰策略的设置,可以通过在redis.conf配置文件中的maxmemory-policy参数设置,或者通过命令CONFIG SET动态修改:
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory 100MB
OK
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "104857600"
相关文章:
Redis——缓存的持久化
1、持久化机制 Redis的所有数据都保存在内存中,如果没有配置持久化功能,Redis重启后数据就会全部丢失,所以需要开启Redis的持久化功能,将数据保存到磁盘上,这样当Redis重启后,可以从磁盘中恢复数据。Redis…...
kafka-splunk数据通路实践
目的: 鉴于目前网络上没有完整的kafka数据投递至splunk教程,通过本文操作步骤,您将实现kafka数据投递至splunk日志系统 实现思路: 创建kafka集群部署splunk,设置HTTP事件收集器部署connector服务创建connector任务&a…...
C语言第十九弹---指针(三)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1、数组名的理解 2、使用指针访问数组 3、⼀维数组传参的本质 4、冒泡排序 5、二级指针 6、指针数组 7、指针数组模拟二维数组 总结 1、数组名的理解…...
TCP/IP LWIP FPGA 笔记
参考资料: 正点原子 LwIP 之 网络接口 netif(ethernetif.c、netif.c)-CSDN博客 IPv4/IPv6、DHCP、网关、路由_ipv6有网关的概念吗-CSDN博客 TCP/IP TCP/IP 协议中文名为传输控制协议/因特网互联协议,又名网络通讯协议…...
2024年海外优青项目申报指南
国家自然科学基金优秀青年科学基金(海外)项目(简称“海外优青项目”),一直备受海外优秀青年学者(包括博士后研究人员)关注,被看作是回国发展最为重要的资助项目之一。知识人网小编现…...
threejs之常用贴图
在三维图形和游戏开发中,高光贴图、凹凸贴图、法线贴图和环境光遮蔽贴图是常用的技术,用于增加虚拟物体表面的细节和真实感,而无需增加更多的几何体。这些技术可以帮助开发者和艺术家创造出既详细又性能高效的场景。 高光贴图(Sp…...
Unity类银河恶魔城学习记录3-1 EnemyStateMachine源代码 P47
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Enemy.cs using System.Collections; using System.Collections.Generic;…...
使用webstorm调试vue 2 项目
学习目标: 使用webstorm调试vue 2 项目 笔者环境: npm 6.14.12 webstorm 2023.1 vue 2 学习内容: 例如: 正常启动npm 项目 配置javaScruot dubug 配置你的项目地址就好 使用dubug运行你配置的调式页 问题 如果进入了js页无…...
深度学习缝模块怎么描述创新点?(附写作模板+涨点论文)
深度学习缝了别的模块怎么描述创新点、怎么讲故事写成一篇优质论文? 简单框架:描述自己这个领域,该领域出现了什么问题,你用了什么方法解决,你的方法有了多大的性能提升。 其中,重点讲清楚这两点…...
html,css,js速成
准备:vscode配好c,python,vue环境,并下载live server插件。 1. html hypertext markup language(超文本标记语言) 1. 基础语法 一个html元素由开始标签,填充文本,结束标签构成。 常见标签说明<b>…...
《Docker极简教程》--Docker基础--基础知识(一)
在这篇文章中我们先大致的了解以下Docker的基本概念,在后续的文章中我们会详细的讲解这些概念以及使用。 一、容器(Container) 1.1 容器的定义和特点 容器的定义 容器是一种轻量级、可移植的软件打包技术,用于打包应用及其依赖项和运行环境,…...
Web html和css
目录 1 前言2 HTML2.1 元素(Element)2.1.1 块级元素和内联(行级)元素2.1.2 空元素 2.2 html页面的文档结构2.3 常见标签使用2.3.1 注释2.3.2 标题2.3.3 段落2.3.4 列表2.3.5 超链接2.3.6 图片2.3.7 内联(行级)标签2.3.8 换行 2.4 属性2.4.1 布尔属性 2.5 实体引用2.6 空格2.7 D…...
Three.js学习6:透视相机和正交相机
一、相机 相机 camera,可以理解为摄像机。在拍影视剧的时候,最终用户看到的画面都是相机拍出来的内容。 Three.js 里,相机 camera 里的内容就是用户能看到的内容。从这个角度来看,相机其实就是用户的视野,就像用户的眼…...
❤ React18 环境搭建项目与运行(地址已经放Gitee开源)
❤ React项目搭建与运行 环境介绍 node v20.11.0 react 18.2 react-dom 18.2.0一、React环境搭建 第一种普通cra搭建 1、检查本地环境 node版本 18.17.0 检查node和npm环境 node -v npm -v 2、安装yarn npm install -g yarn yarn --version 3、创建一个新的React项目…...
2024 RTE行业(实时互动行业)人才发展学习总结
解决方案 人才画像 开发者人才素质要求: 具备多个领域的技术知识注重团队合作,具备协作能力以用户为导向的用户体验意识具备创新思维和解决问题的能力需快速响应行业变化和持续的学习能力具备项目管理能力 学习和吸收新知识的渠道 RTE人才分类...
92.网游逆向分析与插件开发-游戏窗口化助手-显示游戏数据到小助手UI
内容参考于:易道云信息技术研究院VIP课 上一个内容:游戏窗口化助手的UI设计-CSDN博客 码云地址(游戏窗口化助手 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:e8116af3a7b0186adba…...
Stable Diffusion 模型下载:majicMIX fantasy 麦橘幻想
文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 非常推荐的一个非常绚丽、充满幻想的大模型,由国人“Merjic”发布,下载量颇高。这个模型风格炸裂,远距离脸部需要inpaint以达成…...
docker compose安装minio
要使docker-compose管理的容器(如MinIO)在系统启动时自动启动,你需要使用Docker的重启策略。在你的docker-compose.yml文件中为MinIO服务添加restart策略即可实现这一目标。restart: always指令确保了在容器退出时总是重新启动容器࿰…...
二、SSM 整合配置实战
本章概要 依赖整合和添加控制层配置编写(SpringMVC 整合)业务配置编写(AOP/TX 整合)持久层配置编写(MyBatis 整合)容器初始化配置类整合测试 2.1 依赖整合和添加 数据库准备 数据库脚本 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT…...
『运维备忘录』之 Yum 命令详解
运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...
