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 命令详解
运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...