持久化和内存策略

Redis 主要把数据放在内存里。为了重启后恢复数据,Redis 提供 RDB 和 AOF 两种持久化方式。

持久化不等于绝对不丢数据。不同策略只是丢失窗口和性能开销不同。

一、RDB

RDB 是快照持久化,会在某个时间点把内存数据保存成快照文件。

特点:

特点说明
文件紧凑适合备份和恢复
恢复速度快直接加载快照
可能丢数据两次快照之间的数据可能丢失
生成快照有成本大数据量时需要关注 fork 和磁盘 IO

适合:

  • 定期备份
  • 可以接受少量数据丢失的缓存
  • 重启后快速恢复一份数据

二、AOF

AOF 是追加日志持久化,会把写命令追加到文件里。

特点:

特点说明
数据丢失更少可以按秒或每次写入刷盘
文件可能更大记录的是写命令
需要重写AOF rewrite 会压缩历史命令
性能开销更明显刷盘策略越严格,开销越大

常见刷盘策略:

策略说明
always每次写入都刷盘,最安全但最慢
everysec每秒刷盘,常见折中方案
no交给操作系统决定,性能好但风险更高

三、RDB 和 AOF 选择

需求建议
纯缓存可以只开 RDB,甚至不开持久化
允许最多丢几秒AOF everysec
需要备份RDB 快照
恢复时尽量完整AOF 更合适

实际服务常见做法是 RDB + AOF 结合使用,再配合主从复制和备份。

四、内存限制

Redis 应该配置最大内存:

maxmemory 2gb

达到最大内存后按 maxmemory-policy 决定如何处理。

缓存服务常见:

maxmemory-policy allkeys-lru

如果不希望 Redis 自动淘汰数据,可以使用:

maxmemory-policy noeviction

此时内存满了之后,新的写命令会返回错误。

五、大 key 问题

大 key 指 value 很大,或集合里元素很多的 key。

常见例子:

类型大 key 示例
String一个 key 存几 MB 的 JSON
Hash一个 Hash 有几十万个 field
List一个列表有几百万条数据
Set一个集合保存海量用户 ID
Sorted Set一个排行榜无限增长

大 key 的问题:

  • 网络传输慢。
  • 删除可能阻塞。
  • 内存分布不均。
  • 备份和迁移成本高。

处理方式:

  • 拆分 key。
  • 对列表和排行榜做长度限制。
  • 设置 TTL。
  • 使用 UNLINK 异步删除大 key。

六、常用观察命令

INFO memory
INFO persistence
DBSIZE
MEMORY USAGE user:1:profile
SLOWLOG GET 10

含义:

命令作用
INFO memory查看内存使用
INFO persistence查看持久化状态
DBSIZE查看当前库 key 数量
MEMORY USAGE key查看 key 占用内存
SLOWLOG GET 10查看最近慢命令