Exploring
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
  • MySQL

  • Oracle

  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
      • 介绍
      • RDB
        • 使用RDB
        • 优点
        • 缺点
      • AOF
        • 使用AOF
        • 优点
        • 缺点
      • 总结
      • 参考
    • 主从架构
    • 哨兵
    • 集群模式
    • 集群原理篇
    • 一致性哈希算法
    • 一些八股文
  • 数据库
  • Redis
unclezs
2020-08-15
0
目录

数据持久化的两种方式

# 介绍

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(AOF)里面(这称为“全持久化模式”)。

由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,

  • 一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),
  • 一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。

# RDB

# 使用RDB

1.自动RDB快照备份,在配置文件中编辑

#指定保存备份周期下面这个就是 60秒之后至少有10000个key发生改变则执行bgsave进行快照保存
save 60  10000
#启用RDB文件压缩
rdbcompression yes
#指定文件名称
dbfilename dump.rdb
#指定文件存储位置
dir ./
1
2
3
4
5
6
7
8

2.手动保存快照

#异步保存数据
bgsave
#同步保存数据,不常用,多用于redis收到shutdown、term命令后执行这个指令保存后进行快照备份,然后关闭服务器
save
1
2
3
4

# 优点

  1. RDB就是一个二进制的单文件,非常适合备份,比如24小时保存一次RDB文件,这样如果想回滚到某天的数据也是很轻松。
  2. 与AOF相比,RDB允许大型数据集更快地重启。
  3. RDB最大限度地提高了Redis的性能,因为Redis父进程为了持久化所需要做的唯一工作就是fork一个子进程,后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。

# 缺点

  1. 可能会丢失数据,如果保存时间间隔设置的比较长,如果出现服务崩溃,那么最近的数据还没有保存快照则丢失了。
  2. 如果数据量很大,并且CPU性能不佳,那fork出一个子进程可能会很耗时,则可能导致父进程暂停几毫米甚至一秒钟。

# AOF

简单来说,AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化。因此,Redis只要从头到尾重新执行一次AOF文件包含的所有写命令,就可以恢复AOF文件所记录的数据集。

# 使用AOF

配置文件中编辑

#启用AOF
appendonly yes
#设置文件名称,文件夹同RDB的一样,也是dir指定
appendfilename appendonly.aof
#执行同步到文件的三种频率,如果不知道就使用erverysec
# appendfsync always
appendfsync everysec
# appendfsync no
#当AOF文件的体积大于64MB,并且AOF文件的体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行bgrewriteaof命令。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
1
2
3
4
5
6
7
8
9
10
11

注意:

  • 如果使用了 appendfsync always,那么每次执行指令都会写入文件,这样可能照成大量的磁盘IO。
  • 如果使用了appendfsync no,那么Redis将不对AOF文件执行任何显式的同步操作,而是由操作系统来决定应该在何时对AOF文件进行同步。这个选项在一般情况下不会对Redis的性能带来影响,但系统崩溃将导致使用这种选项的Redis服务器丢失不定数量的数据。另外,如果用户的硬盘处理写入操作的速度不够快的话,那么当缓冲区被等待写入硬盘的数据填满时,Redis的写入操作将被阻塞,并导致Redis处理命令请求的速度变慢。因为这个原因,一般来说并不推荐使用。

手动重写AOF,会删除冗余命令,减少文件大小。

bgrewriteaof
1

# 优点

  1. 服务崩溃时候数据丢失比较小,只丢失1秒钟。
  2. AOF日志是仅追加的日志,因此,如果断电,则不会出现寻道或损坏问题。即使由于某种原因(磁盘已满或其他原因)以半写命令结束日志,redis-check-aof工具也可以轻松修复它。
  3. AOF以易于理解和解析的格式包含所有操作的日志。您甚至可以轻松导出AOF文件。
  4. 误删恢复,比如执行了flushall命令则可以用这个aof文件恢复

# 缺点

  1. 文件体积比RDB大。也会导致数据还原时间会很长。
  2. 因为AOF重写也会fork子进程,那么耗时问题还是存在,这个时候如果去rewrite一个很大的AOF文件,那么删除文件可能就会导致操作系统挂起数秒。
  3. 根据确切的fsync策略,AOF可能比RDB慢。

# 总结

  • RDB持久性按指定的时间间隔保存内存中这个时间点的数据快照
  • AOF就是记录每次写命令到文件,下次启动的时候从文件中读取再重新执行一次。

RDB和AOF可以同时工作,但是启动的时候会使用AOF文件来重建数据集。根据特性选择合适的策略。

# 参考

官方文档 (opens new window)

在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11
跳越表
主从架构

← 跳越表 主从架构→

Theme by Vdoing | Copyright © 2018-2024 unclezs
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式