zoukankan      html  css  js  c++  java
  • Redis持久化

    Redis持久化

    redis 虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按照一定的策略保存到硬盘上,从而实现数据持久保存的目的,redis 支持两种不同方式的数据持久化保存机制,分别是 RDB 和 AOF

    RDB模式

    基于时间的快照,只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前快照未完成之间的数据。

    RDB 实现的具体过程 Redis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如 dump.rdb.temp,当数据保存完成之后再将上一次保存的 RDB 文件替换掉,然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,因为直接替换 RDB文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关机停止保存而导致数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据。

    RDB模式优缺点

    优点:

    RDB 快照保存了某个时间点的数据,可以通过脚本执行 bgsave(非阻塞)或者 save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。

    可以最大化 io 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的操作都会由这个子进程操作,父进程无需任何的 IO 操作RDB 在大量数据比如几个 G 的数据,恢复的速度比 AOF 的快

    缺点:

    不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据

    数据量非常大的时候,从父进程 fork 的时候需要一点时间,可能是毫秒或者秒

    AOF模式

    按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高,缺点是即使有些操作是重复的也会全部记录。

    AOF 和 RDB 一样使用了写时复制机制,AOF 默认为每秒钟 fsync 一次,即将执行的命令保存到 AOF 文件当中,这样即使 redis 服务器发生故障的话顶多也就丢失 1 秒钟之内的数据,也可以设置不同的 fsync策略,或者设置每次执行命令的时候执行 fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入 AOF 文件的 IO 影响

    1.所有写入命令会追加到aof buf(缓冲区)中

    2.AOF缓冲区根据对应的策略向硬盘做同步操作

    3.随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的

    appendonly yes          # 是否打开aof日志功能
    appendfsync always      # 每一个命令,都立即同步到aof
    appendfsync everysec 	# 每秒写1次
    appendfsync  no 	    # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入磁盘
    appendfilename "xx.aof" # AOF 文件名
    

    AOF模式优缺点

    优点:

    数据安全性相对较高,顶多也就丢失 1 秒钟之内的数据

    缺点:

    AOF 的文件大小要大于 RDB 格式的文件

    根据所使用的 fsync 策略(fsync 是同步内存中 redis所有已经修改的文件到存储设备),默认是appendfsync everysec 即每秒执行一次 fsync

    即使有些操作是重复的也会全部记录

    问题

    1、RDB和AOF两种模式同时存在,redis重启会读取哪个文件的数据?

    两个同时存在会读取AOF,忽略 RDB 文件

    每天进步一点点
  • 相关阅读:
    显示器的分类和主要性能指标
    关闭Win 10 自动更新功能
    MySQL下载安装教程
    经济学十大原理
    西方经济学概述(经济学原理 1 )
    工作表基本操作
    输入和编辑工作表
    因特网概述
    摩尔定律(Moore's Law)
    C 语言编程机制
  • 原文地址:https://www.cnblogs.com/Otiger/p/14580598.html
Copyright © 2011-2022 走看看