当前位置: 首页 > article >正文

Redis 持久化数据

1.基本概念:

        Redis 支持两种主要的持久化方式:RDB (Redis DataBase)和AOF (Append Only File),用于将内存中的数据持久化到磁盘上,以避免数据在服务器重启或意外故障时丢失。

2.RDB(Redis DataBase):

        将某一个时刻的内存数据,以二进制的方式写入磁盘。

  • 原理:Redis 会在特定的时间间隔或达到特定条件时生成一个数据快照,将所有的数据写入到一个 RDB 文件中。
  • 优点
    • RDB 文件紧凑、体积小,便于备份。
    • 加载 RDB 文件比 AOF 更快,因此适合大数据量的恢复。
    • 适用于周期性的备份,比如每天或每小时一次的备份。
  • 缺点
    • 由于是间隔性的快照,如果 Redis 崩溃,最近一次快照后的数据可能会丢失。
    • 大量数据时,生成快照的过程会消耗 CPU 和内存,影响性能。

3.AOF(Append Only File):

               每一次写操作都记录到日志文件中的方式。

  • 原理:Redis 将每一条写入命令追加写入到 AOF 文件中,Redis 重启时通过重放 AOF 文件中的命令来恢复数据。
  • 优点
    • 数据安全性更高,可以设置同步策略保证几乎不丢失数据(比如每秒同步一次)。
    • AOF 文件是命令日志,易于理解和修改。
  • 缺点
    • AOF 文件比 RDB 文件大,恢复速度较慢。
    • 需要定期对 AOF 文件进行重写以减小文件大小。

3. 混合持久化

        Redis 4.0 及之后版本引入了混合持久化模式,将 RDB 和 AOF 的优势结合。即在重写 AOF 文件时,Redis 将同时生成一个 RDB 快照,并将最近的操作记录追加到 AOF 中。这样既能享受 RDB 的快速恢复,又能保证 AOF 的高安全性。

  • 原理:当 Redis 需要将数据持久化到磁盘时,会保存一个 RDB 快照,并在快照的基础上追加 AOF 文件中的命令。这样可以减少 AOF 文件的大小,同时提高数据恢复的效率。
  • 过程
    • Redis 启动时,首先通过 RDB 快照恢复数据,然后通过 AOF 文件补充快照后发生的变更。
    • 因为 AOF 只需要记录 RDB 之后的变更,所以文件大小减少,加载速度更快。

4.RDB和AOF的区别:

(1).存储方式:

        RDB :通过快照(snapshot)机制,将 Redis 中的数据集以二进制文件的方式写入硬盘;

        AOF :通过将 Redis 服务器执行的所有写命令(例如 set、del、incrby 等)记录在 AOF 文件中,写入方式是追加写入

(2).数据恢复

        RDB:恢复时加载最近一次生成的快照。这意味着数据可能会丢失最近的一些操作

        AOF:记录每次写操作,恢复时按顺序重放这些操作。因此,它能恢复最近的所有操作,数据丢失的风险更小

(3).性能

        RDB:由于 RDB 是定时执行快照,所以它对性能影响较小,适合对性能要求高、数据恢复精度要求不高的场景。

        AOF:AOF 每次写入操作都会记录,尤其在同步频率较高时(appendfsync 设为 always),对性能影响较大。不过在日志文件重写时,Redis 会压缩 AOF 文件,减少开销。

(4).数据一致性

        RDB:RDB 只能在设定的快照时间点恢复数据,因此可能会丢失快照之后的一些数据。

        AOF:AOF 提供更高的数据一致性,因为它记录了每一次操作,几乎不会丢失数据。

(5).文件体积

        RDB:由于 RDB 以二进制快照的形式存储,文件体积通常较小。

        AOF:AOF 文件随着时间推移可能会变得很大,因为它记录了所有写操作。不过,Redis 提供了日志重写机制,可以通过重写来压缩文件。

(6).使用场景

        RDB 适用于:

  • 数据一致性要求不高的场景(如缓存场景)。
  • 系统负载较重时,减少持久化对性能的影响。
  • 需要快速加载大数据集的场景。

        AOF适用于:

  • 数据一致性要求较高的场景。
  • 希望最小化数据丢失的情况。


http://www.kler.cn/a/315976.html

相关文章:

  • 【mysql的当前读和快照读】
  • React中 修改 html字符串 中某些元素的属性
  • websocket初始化
  • 【常见问题解答】远程桌面无法复制粘贴的解决方法
  • 【C语言】值传递和地址传递
  • Could not initialize class sun.awt.X11FontManager
  • 【详细解答】指出下面指令的错误:IN AL,300H
  • MySQL高阶1939-主动请求确认消息的用户
  • 占用消防通道监测摄像机
  • MyBatis-Plus 插件扩展
  • linux强制关闭再启动后zookeeper无法启动
  • 使用Python免费将pdf转为docx
  • JVM频繁Full GC问题的排查与解决方案
  • 展锐平台的手机camera 系统开发过程
  • 2024年最新前端工程师 TypeScript 基础知识点详细教程(更新中)
  • Java启动Tomcat: Can‘t load IA 32-bit .dll on a AMD 64-bit platform报错问题解决
  • 【小沐学GIS】blender导入OpenStreetMap城市建筑(blender-osm、blosm)
  • 数据要素如何重塑企业价值?
  • SpringBoot开发——Spring Boot Controller 最佳实践
  • 数据库 - MySQL介绍
  • 离职员工客户如何管理?解锁2024企业微信新功能
  • 清空当前机器所有Docker容器和镜像
  • C#通过键盘钩子实现二维扫描枪传输数据的接收
  • 亮相世界制造业大会,智象未来(HiDream.ai)揭示产业发展新趋势
  • python爬虫:将知乎专栏文章转为pdf
  • JMeter(需要补充请在留言区发给我,谢谢)