redis内存持久化机制和淘汰策略使用详解

 更新时间:2025年12月26日 09:55:39   作者:kkkkkkkkl24  
本文主要介绍了Redis的持久化和淘汰策略,持久化机制包括RDB(快照持久化)、AOF(追加日志持久化)和混合持久化,RDB通过快照将内存数据写入磁盘,AOF记录每条写命令并重放以恢复数据,淘汰策略则根据数据访问频率和过期时间进行选择,以避免内存溢出

1.为什么需要持久化和淘汰策略

在日常使用redis的过程中,数据安全内存管理是必须重点考虑的问题。

redis是基于内存的数据库,内存断电即失,所以需要持久化保证数据安全。

  • 持久化

解决数据断电丢失的问题;

redis内存有限,但数据超出阈值时,需要淘汰策略来决定哪些数据被清理。

  • 淘汰策略

解决内存不足时如何存放新数据的问题。

2.持久化机制

redis作为内存数据库,如果不做持久化,宕机后数据会全部丢失,为此redistribution提供了三种持久化方案。

2.1RDB(快照持久化)

原理:周期性将内存数据快照写入磁盘,生成dump.rdb文件。

触发方式

  • 配置触发:
save 900 1     # 900 秒内有 1 次写操作则触发
save 300 10    # 300 秒内有 10 次写操作则触发
save 60 10000  # 60 秒内有 10000 次写操作则触发
  • 手动触发:
SAVE       # 阻塞 Redis,生成快照
BGSAVE     # 后台 fork 子进程生成快照(推荐)

底层实现细节

BGSAVE 流程

  • 主进程执行 fork,生成子进程;
  • 子进程负责将快照写入磁盘文件;
  • 主进程继续处理客户端请求。

写时复制(Copy-On-Write, COW)

fork后,父子进程共享内存页;

如果有写请求修改数据,操作系统会复制出新内存页:

  • 子进程使用旧数据页生成 RDB;
  • 主进程在新数据页上继续服务。
  • 保证了快照的一致性,同时不会阻塞主进程。

缓冲区机制

  • 在快照生成过程中,新的写操作会写入 Redis 的正常数据结构;
  • 子进程只写fork时刻的内存数据,不包含之后的新写入;
  • 因此,RDB 只反映快照时刻的数据,可能丢失最近一次快照之后的数据。

优点:文件体积小,恢复速度快,适合做全量备份。

缺点:最后一次快照之后的数据可能会丢失。

2.2AOF(追加日志)

原理:记录每条写命令,追加到日志文件 appendonly.aof,Redis 重启时重放日志恢复数据。

AOF重写

 文件过大时,redis会进行AOF重写:压缩日志,值保留恢复当前数据集的必要命令。

BGREWRITEAOF

使用方式

  • 开启方式
appendonly yes
appendfilename "appendonly.aof"

刷盘策略:

  • always:每次写操作立即写盘(最安全,最慢)。
  • everysec:每秒写一次盘(推荐)。
  • no:完全交由操作系统(可能丢几秒数据)。

2.3混合持久化(RDB+AOF)

  • 原理:Redis 4.0 引入,将 RDB 快照与增量 AOF 结合。
  • 优点:RDB提供基线数据,恢复快;AOF记录快照之后的写操作,减少数据丢失。

配置

aof-use-rdb-preamble yes

推荐:生产环境普遍采用混合持久化。

3.淘汰策略

1. 配置方式

maxmemory 512mb
maxmemory-policy allkeys-lru

2. 淘汰策略分类

不淘汰:noeviction,直接拒绝写入(默认)

 仅淘汰过期键:

  • volatile-lru:淘汰最近最少使用的过期键。
  • volatile-ttl:淘汰即将过期的键。
  • volatile-random:随机淘汰过期键。
  • volatile-lfu:淘汰访问频率最低的键。

 淘汰所有键:

  • allkeys-lru:淘汰最近最少使用的键。
  • allkeys-random:随机淘汰一个键。
  • allkeys-lfu:淘汰访问频率最低的键。

3. LRU 与 LFU

  • LRU:最近最少使用,适合热点数据场景。
  • LFU:最少使用频率,适合长尾访问场景。

LRU 并不是全局精确淘汰,而是近似算法

  • Redis 不会扫描所有 key,而是每次 随机取出一部分 key(默认 5 个,可配置);
  • 在采样的这批 key 中,选择 最久未使用的一个 淘汰;
  • 如果内存还是不足,就继续随机采样,直到释放出足够的内存。
# 默认采样 5 个 key
maxmemory-samples 5
# 可以调大,比如 20,提高淘汰的准确度,但 CPU 开销也会增加
maxmemory-samples 20

LFU 需要记录每个 key 的访问频率,Redis 使用的是 对数递增计数器(log counter),避免计数无限增长。淘汰机制类似LRU。

# 访问频率递减的时间因子(越大,计数越快衰减)
lfu-decay-time 1

总结

持久化

  • RDB:快照,全量备份,快速恢复,但可能丢数据;
  • AOF:日志,数据更安全,但文件更大;
  • 混合:结合两者优点,推荐生产使用。

淘汰策略

  • noeviction:安全,但可能拒绝服务;
  • LRU / LFU:常用,适合缓存业务;
  • 选择合适的策略,避免 OOM。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Redis缓冲区机制

    浅谈Redis缓冲区机制

    本文主要介绍浅谈Redis缓冲区机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 百行代码实现基于Redis的可靠延迟队列

    百行代码实现基于Redis的可靠延迟队列

    本文主要介绍了百行代码实现基于Redis的可靠延迟队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 关于Redis库存超卖问题的分析

    关于Redis库存超卖问题的分析

    在高并发场景下进行优惠券秒杀测试时,发现由于并发操作导致了超卖问题,即理论上只能卖出100个优惠券,实际卖出了102个,分析原因,是因为在高并发环境下,多个线程同时操作库存,导致数据不一致,提出了两种解决方案:悲观锁和乐观锁
    2024-11-11
  • Redis分布式限流组件设计与使用实例

    Redis分布式限流组件设计与使用实例

    本文主要讲解基于 自定义注解+Aop+反射+Redis+Lua表达式 实现的限流设计方案。实现的限流设计与实际使用。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Redis生成分布式系统全局唯一ID的实现

    Redis生成分布式系统全局唯一ID的实现

    在互联网系统中,并发越大的系统,数据就越大,数据越大就越需要分布式,本文主要介绍了Redis生成分布式系统全局唯一ID的实现,感兴趣的可以了解一下
    2021-10-10
  • 详解SSH框架和Redis的整合

    详解SSH框架和Redis的整合

    本篇文章主要介绍了SSH框架和Redis的整合,详细的介绍了Struts+Spring+Hibernate和Redis整合,有兴趣的可以了解一下。
    2017-03-03
  • redis Template.opsForValue()中方法实例详解

    redis Template.opsForValue()中方法实例详解

    这篇文章主要介绍了redis Template.opsForValue()中方法讲解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 如何使用Redis 实现分布式锁(含自动续期与安全释放)

    如何使用Redis 实现分布式锁(含自动续期与安全释放)

    本文详解用Redis实现分布式锁,包含自动续期与安全释放,推荐使用Redisson,内置可重入、Watchdog及高可用支持,对比原生和自研方案,强调其在生产环境的高效与安全性,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • 如何利用Redis List实现Java数据库分页快速查询

    如何利用Redis List实现Java数据库分页快速查询

    这篇文章主要给大家介绍了关于如何利用Redis List实现Java数据库分页快速查询的相关资料,Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,需要的朋友可以参考下
    2024-02-02
  • redis的五大数据类型应用场景分析

    redis的五大数据类型应用场景分析

    这篇文章主要介绍了redis的五大数据类型实现原理,本文给大家分享五大数据类型的应用场景分析,需要的朋友可以参考下
    2021-08-08

最新评论