Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > redis内存持久化机制和淘汰策略

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

作者: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 流程

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

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

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

缓冲区机制

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

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

2.2AOF(追加日志)

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

AOF重写

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

BGREWRITEAOF

使用方式

appendonly yes
appendfilename "appendonly.aof"

刷盘策略:

2.3混合持久化(RDB+AOF)

配置

aof-use-rdb-preamble yes

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

3.淘汰策略

1. 配置方式

maxmemory 512mb
maxmemory-policy allkeys-lru

2. 淘汰策略分类

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

 仅淘汰过期键:

 淘汰所有键:

3. LRU 与 LFU

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

# 默认采样 5 个 key
maxmemory-samples 5
# 可以调大,比如 20,提高淘汰的准确度,但 CPU 开销也会增加
maxmemory-samples 20

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

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

总结

持久化

淘汰策略

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

您可能感兴趣的文章:
阅读全文