Redis持久化

为什么要持久化?

Redis是一种支持内存存储的键值对数据库,它可以将数据存储在内存中以提供高性能的读写操作。然而,由于内存的易失性,一旦Redis进程关闭或服务器断电,内存中的数据将会丢失。为了解决这个问题,Redis提供了持久化机制,将数据写入磁盘以便在重启后进行恢复。

Redis支持两种主要的持久化方式:

1. RDB(Redis数据库文件)持久化

RDB持久化是通过将Redis的数据快照写入磁盘来实现的。当满足一定条件时(如在指定的时间间隔内有指定数量的写操作),Redis会自动触发RDB持久化操作。该操作会生成一个二进制文件,包含了当前内存中的所有数据。RDB持久化是非常紧凑和高效的,适合用于备份、灾难恢复和数据迁移。

执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令

  • 执行bgsave命令

  • Redis停机时

  • 触发RDB条件时

1)save命令

执行下面的命令,可以立即执行一次RDB:(save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。)

2)bgsave命令

下面的命令可以异步执行RDB(执行的时候主进程不受影响,可以继续处理用户的请求)

3)停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# x秒内,如果至少有y个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save x y

2. AOF(Append Only File)持久化

AOF持久化是通过将Redis的所有写操作追加到一个文件中来实现的。当Redis重启时,会重新执行这个文件中的写操作来恢复数据。AOF持久化可以确保数据的完整性和持久性,但相对于RDB持久化,它的文件通常会更大,恢复时间也更长。

AOF配置

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

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

AOF持久化有三种不同的同步策略可供选择:

我们可以在Redis的配置文件中设置AOF持久化的同步策略和其他相关配置。

  • always:每个写操作都立即同步到磁盘,保证最高的数据安全性,但性能较低。
  • everysec:每秒同步一次,平衡了数据安全性和性能。
  • no:完全依赖操作系统进行同步,性能最高,但数据安全性较低。

AOF文件重写

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

总结

两种持久化方式的不同:
 

  1. 数据格式:

    • RDB持久化:RDB持久化通过生成一个二进制的数据快照文件来保存Redis的数据。该文件是以二进制格式存储的,相对紧凑,适合用于备份、灾难恢复和数据迁移。
    • AOF持久化:AOF持久化通过将Redis的写操作以日志的形式追加到一个文件中。该文件以文本格式存储,包含了Redis的命令和参数,以易读易理解的方式记录了数据的变化。
  2. 持久化过程:

    • RDB持久化:RDB持久化是通过在指定的时间间隔内或写操作达到指定数量阈值时,生成一个快照文件,将内存中的数据写入磁盘。RDB持久化是一个全量持久化过程,即将当前时刻的所有数据保存到文件中。
    • AOF持久化:AOF持久化是通过将每个写操作追加到AOF文件的末尾来实现。当Redis重启时,它会重新执行AOF文件中的写操作来恢复数据。AOF持久化是一个增量持久化过程,即将写操作追加到文件中,记录数据的变化。
  3. 文件大小和恢复时间:

    • RDB持久化:由于RDB文件是二进制的数据快照,相对较小,恢复速度较快。但它只包含了某个时间点的数据,如果Redis关闭时发生故障,可能会丢失最后一次快照之后的数据。
    • AOF持久化:AOF文件以文本格式存储Redis的写操作,相对较大,恢复速度较慢。但它包含了所有写操作的日志,可以保证更高的数据完整性,即使Redis关闭时发生故障,也可以通过重放AOF文件来恢复所有数据。
  4. 同步策略:

    • RDB持久化:RDB持久化并不会实时同步数据到磁盘,而是在指定的时间间隔内或写操作达到指定数量阈值时进行。因此,存在一定的数据丢失的风险。
    • AOF持久化:AOF持久化可以选择不同的同步策略,如always、everysec和no。always会在每个写操作后立即同步到磁盘,保证最高的数据安全性;everysec会每秒同步一次,平衡了数据安全性和性能;no则完全依赖操作系统进行同步,性能最高但数据安全性较低。

我们还可以同时启用RDB持久化和AOF持久化,以提供更高的数据安全性和恢复能力。在Redis重启时,它会首先加载AOF文件,然后再使用RDB文件进行恢复。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stu_kk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值