Python技术迷

redis 的持久化方案有哪些?

Redis 的持久化,说实话,刚开始接触的时候我是真没当回事。毕竟我当时的 Redis 是个工具人,负责干嘛?缓存啊!存点临时数据、做点热点缓存、减点数据库压力,用完就扔的那种,压根没考虑过“你活着的时候记点东西,万一挂了还能想起来自己是谁”。

但工作久了(不是我说自己资深啊,是工作自然“打脸”让我意识到),只把 Redis 当缓存用其实是远远不够的。

一、Redis 真的需要持久化吗?

我们得先认清一个现实:Redis 虽然是内存数据库,但它是能存盘的。

Redis 的默认模式是内存 + 持久化,也就是:数据都在内存里跑得飞快,挂了还能从磁盘拉起来。

那问题来了:你要不要让 Redis 去“存盘”?也就是——你要不要持久化?

答案其实很典型:看场景。

  • • ✅ 如果你 Redis 里放的是重要数据,比如计数器、Session、商品库存、队列数据等,持久化必须开。
  • • ❌ 如果你只是用 Redis 当缓存,失效就拉数据库重新加载一遍,那就关掉,免得给磁盘添麻烦。

二、Redis 的持久化方案有哪些?

常规来说,有三种(当然主从/哨兵算架构层面的,今天重点说前两种):

1. RDB(快照模式)

Redis 的 RDB 模式,说白了就是:定期把内存里所有数据“拍个快照”,存成一个 .rdb 文件。

这玩意最大的特点就是两个字:高效。

  • • 保存的时候,Redis fork 出一个子进程,然后这个子进程把内存 copy 一份,慢慢写磁盘,妈妈再也不用担心阻塞主线程;
  • • 恢复的时候,直接读文件恢复,速度贼快;
  • • 占空间小,写入磁盘速度也快。

但是呢,这玩意粒度很粗,你设置成每 5 分钟拍一次,那中间这 5 分钟的数据变化就没了。如果你在它存盘之前断电了?Sorry,白干了。

👇 RDB 的配置示例:

# 在 redis.conf 中
save 900 1      # 900 秒内至少有 1 个 key 改变就触发持久化
save 300 10     # 300 秒内至少有 10 个 key 改变就触发
save 60 10000   # 60 秒内至少有 10000 个 key 改变就触发

想禁用?全注释掉 save 就行。

2. AOF(Append Only File)

AOF 是怎么工作的?它把 Redis 执行的每一个写操作的命令,都记录下来,一条条写进 .aof 文件里。

有点像你小时候上课记笔记的风格,每个动作都记录一笔。

它的特点是:非常非常完整,哪怕你刚插入一个 key,马上掉电,也能靠日志完整恢复回来。

当然,也有代价:

  • • 文件比 RDB 大很多;
  • • 恢复的时候要把每一条命令都“重演”一遍,慢一点;
  • • 写入比较频繁的话,IO 压力比较大。

👇 AOF 的配置示例:

appendonly yes# 开启 AOF
appendfsync everysec          # 每秒写入一次,性能和安全的折中

你可以设置三种写入策略:

  • • always:每次写操作都 fsync(最安全,最慢)
  • • everysec:每秒 fsync 一次(默认)
  • • no:完全交给操作系统(最快,最不安全)

3. 混合模式:RDB + AOF,一起上!

讲真,我自己最推荐的其实是:RDB + AOF 混合持久化。

为什么?

  • • RDB 恢复快,但不够实时;
  • • AOF 实时性高,但写入成本高;
  • • 两者一起用,互补优势,既有备份,又能增量记录。

而且 Redis 4.0+ 支持了混合写入,AOF 会先写入最近一次 RDB 的内容,再追加 AOF 日志,恢复的时候效率更高。

👇 开启混合模式:

appendonly yes
appendfilename "appendonly.aof"

别担心,默认就支持混合格式,只要你 AOF 是开启的。

三、段子时间:掉电的 Redis 和我妈的菜市场小本子🧾

说个段子哈,我妈以前卖菜记账都是写在小本子上的,每次有人买菜她都能唰唰唰记一笔。

我就问她:“妈,这你要是掉了怎么办?”

她说:“掉了就掉了呗,大不了记忆重建。”

我顿时就明白了:这是不开持久化的 Redis 啊!

后来她怕万一真的掉了,就每晚都拍照传我微信——这不就是 RDB 快照嘛!

再后来,她让我帮她整个 Excel 表格,我还给她写了个 Python 脚本,改成每条都自动记录——AOF 完美上线!

现实里最怕的事不是 Redis 掉电,而是老板早上 9 点问你:“Redis 的库存怎么没了?”

你说:“没开持久化。”

老板:“那你就别来了。”

四、写个小脚本,玩玩 AOF 写法

我们写个模拟 Redis 的 AOF 追加机制的小例子,当然只是演示:

defwrite_aof(command, filepath="appendonly.aof"):
withopen(filepath, "a") as f:
        f.write(command + "\n")

write_aof("SET user:1000 name 'Tom'")
write_aof("INCR page:view:home")
write_aof("DEL temp:key")

运行几次看看生成的 appendonly.aof 文件,是不是有点感觉了?

五、到底选谁?

一句话总结:重要数据就别抠门,该开的持久化咱就开,不然等挂的时候哭都来不及。

  • • Redis 就当缓存?不开持久化;
  • • Redis 也当小数据库?建议 AOF + RDB 混合开起来;
  • • 想减少文件体积、备份定期快照?RDB 就够了;
  • • 想追求数据完整性、尽量不丢数据?AOF 是王道。

最后

程序员的日常,其实很像 Redis 的持久化策略。

我们也有时候想“靠内存”撑着:不做笔记、不写文档、不留痕迹,全靠脑子记。但总有断电的那一刻——可能是项目跑路,也可能是自己猝不及防“下线”。

所以啊,有空多写写,哪怕只是 AOF 那种“每条操作都记一笔”的方式,日后不迷路,才是真的安全持久化。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek