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

redis持久化和数据淘汰方案


title: redis持久化
date: 2025-05-18 13:01:07
tags: redis
categories: redis的问题方案

Redis持久化方案

RDB

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据

在这里插入图片描述
Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# 900秒内,如果至少有1个key被修改,则执行bgsave 
save 900 1  
save 300 10  
save 60 10000 

RDB的执行原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。fork采用的是copy-on-write技术:
当主进程执行读操作时,访问共享内存;
当主进程执行写操作时,则会拷贝一份数据,执行写操作。
在这里插入图片描述

优点解释
✨ 内存效率高只在写操作时拷贝数据,不会整块复制,大大节省内存
✨ 服务不中断主进程正常服务,RDB 快照异步生成
✨ 快照性能好子进程写磁盘,避免与主线程争资源
✨ 快照数据一致基于 fork 时刻的数据,具有一致性视图

如果直接用save命令会阻塞Redis主线程,性能不太好

AOF

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

在这里插入图片描述

AOF文件会记录指令

AOF的配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

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

AOF的命令记录的频率也可以通过redis.conf文件来配:

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

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。(并且文件会进行压缩乱码)

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

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb 

两种方式的比较

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

数据淘汰方案

惰性删除

惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key

set name zhangsan  
get name   //发现name过期了,直接删除key

优点 :对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查

缺点 :对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放

定期删除

定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)。

定期清理有两种模式:

SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf 的hz 选项来调整这个次数

FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

http://www.xdnf.cn/news/7161.html

相关文章:

  • NB-IoT技术深度解析:部署模式与节能机制全指南
  • SONiC系统之高速数据遥测High Frequency Telemetry
  • Java中的伪共享(False Sharing):隐藏的性能杀手与高并发优化实战
  • Python训练营---Day29
  • 劳特巴赫trace32自定义调试界面
  • mysql的高可用
  • 基于MCP的AI Agent应用开发实践
  • 类的加载过程详解
  • 如何本地部署Qwen3系列的大小模型235B/32B并进行推理服务及并发测试?
  • 力扣1991:找到数组的中间位置(前缀和)
  • 三、关系数据库
  • leetcode报错原因总结需要背下来的程序片 [更新中]
  • MinIO:从入门到精通,解锁云原生存储的奥秘
  • 程序代码篇---python向http界面发送数据
  • Ubuntu搭建TFTP服务器的方法
  • OpenCL C++图像纹理处理
  • jvm安全点(四)openjdk17 c++源码垃圾回收之安全点轮询页内存设置不可访问
  • 前端图片上传组件实战:从动态销毁Input到全屏预览的全功能实现
  • 备份C#的两个类
  • 【DAY22】 复习日
  • 三、高级攻击工具与框架
  • React Flow 边的基础知识与示例:从基本属性到代码实例详解
  • 飞机飞行控制系统补偿模型辨识报告
  • HarmonyOS AVPlayer 音频播放器
  • 【2025软考高级架构师】——2022年11月份真题与解析
  • 【方法论】如何构建金字塔框架
  • C++ for QWidget:connect(连接)
  • C++ asio网络编程(8)处理粘包问题
  • Java IO及Netty框架学习小结
  • 学习黑客 http 响应头