本文将介绍Redis持久化的两种方式:快照持久化和AOF持久化,并对两种方法进行分析和对比,方便在实际中做出选择。

持久化


什么是持久化

Redis所有数据保存在内存中,对数据的更新将异步地保存到磁盘上,使得数据在Redis重启之后仍然存在。这么做这有什么实际意义呢?将数据存储到硬盘是为了以后可以重用数据,将数据进行备份,可以在系统故障的时候从备份进行恢复。还有一点,存储在Redis里面的数据可能是经过复杂运算而得出的结果,把这些数据进行存储,方便后续的使用,以达到“空间换时间”的效果。

持久化的实现方式

Redis提供了两种不同的持久化方法将数据保存到硬盘里面。

快照持久化:将Redis某一时刻存在的所有数据都写入硬盘。

AOF持久化:AOF的全称叫append-only file,中文意思是只追加文件。当使用AOF持久化方式的时候,Redis执行写命令的时候,将被执行的写命令复制到硬盘里面,说的通俗一点就是写日志。

快照持久化


什么是快照持久化

Redis通过创建快照来获得存储在内存里面的数据在某个时间节点上的副本。

触发机制-主要三种方式

1、save(同步)

2、bgsave(异步)

3、自动

save命令:客户端向Redis发送save命令来创建一个快照文件。

执行save命令的时候,如果存在老的快照文件,新的将会替换老的。

bgsave命令:客户端向Redis发送bgsave命令,Redis调用fork创建一个子进程,然后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。

save命令和bgsave命令对比:

命令

save

bgsave

IO类型

同步

异步

是否阻塞

复杂度

O(n)

O(n)

优点

不会消耗额外内存

不阻塞客户端命令

缺点

阻塞客户端命令

需要fork,消耗内存

自动生成:通过配置,满足任何一个条件就会创建快照文件。

快照持久化选项:

多久执行一次自动快照操作,60s之内有1000次操作写入时执行
save 60 1000
创建快照失败后是否仍然继续执行写命令
stop-writes-on-bgsave-error no
是否对快照文件进行压缩
rdbcompression yes
命名硬盘上的快照文件
dbfilename dump.rdb

最佳配置:

dbfilename dump-${port}.rdb
dir /bigdiskpath
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

AOF持久化


快照持久化现存问题

耗时、耗性能:通过bgsave命令进行持久化的的时候,需要fork一个子进程,如果数据量很大的话,需要的内存也会相应的变大,内存的占用会导致Redis性能降低。

不可控、丢失数据:举个例子,上一次创建快照是11:00开始创建并创建成功。如果Redis在12:00开始创建新的快照,如果系统在未完成创建快照之前崩溃,11:00-12:00写入的数据将会丢失;如果系统在快照创建完成之后崩溃,那么12:00之后,创建快照的过程中的数据将会丢失。

什么是AOF

AOF持久化将被执行的写命令写到AOF文件的末尾,以达到记录数据的目的。Redis只要从头到尾重新执行一次AOF所有的命令就可以恢复数据。

AOF三种策略


always:每条Redis写命令都同步写入硬盘。

everysec:每秒执行一次同步,将多个命令写入硬盘。

no:由操作系统决定何时同步。

三种策略对比:生产环境中需要根据实际的需求进行选择。

命令 always everysec no
优点 不丢失数据 每秒一次fsync 不用管
缺点 IO开销较大,一般的SATA盘只有几百TPS 丢1s数据 不可控

AOF重写


随着Redis的运行,被执行的写命令不断同步到AOF文件中,AOF文件的体积越来越大,极端情况将会占满所有的硬盘空间。如果AOF文件体积过大,还原的过程也会相当耗时。为了解决AOF文件不断膨胀的问题,需要移除AOF文件中的冗余命令来重写AOF。

原生AOF AOF重写

set hello world

set hello java

set hello redis

incr counter

inct counter

rpush mylist a

rpush mylist b

rpush mylist c

过期数据

set hello redis

set counter 2

rpush mylist a b c

AOF重写的两种实现方式

  • bgrewriteaof命令

bgrewriteaof命令和bgsave命令的工作原理相似:Redis创建一个子进程,然后由子进程负责对AOF文件进行重写。

  • AOF重写配置

配置参数说明:

名称 含义
auto-aof-rewrite-min-size AOF文件重写需要的尺寸
auto-aof-rewrite-percentage AOF文件增长率

具体配置:

appendonly yes
appendfilename "appendonly-${port}.aof"
appendfsync everysc
dir /bigdiskpath
no-appendfsync-on-rwrite yes
auto-aof-rewrit-percentage 100
auto-aof-rewrite-min-size 64mb

快照持久化和AOF持久化的对比和选择


对比

命令 快照持久化 AOF持久化
启动优先级
体积
恢复速度
数据安全性 丢数据 根据策略决定
轻重

选择

在实际生产环境中,根据数据量、应用对数据的安全要求、预算限制等不同情况,会有各种各样的持久化策略;如完全不使用任何持久化、使用快照持久化或AOF持久化的一种,或同时开启快照持久化和AOF持久化等。此外,持久化的选择必须与Redis的主从策略一起考虑,因为主从复制与持久化同样具有数据备份的功能,而且主机master和从机slave可以独立的选择持久化方案。

(1)如果Redis中的数据完全丢弃也没有关系(如Redis完全用作DB层数据的cache),那么无论是单机,还是主从架构,都可以不进行任何持久化。

(2)在单机环境下(对于个人开发者,这种情况可能比较常见),如果可以接受十几分钟或更多的数据丢失,选择快照持久化对Redis的性能更加有利;如果只能接受秒级别的数据丢失,应该选择AOF。

(3)但在多数情况下,我们都会配置主从环境,slave的存在既可以实现数据的热备,也可以进行读写分离分担Redis读请求,以及在master宕掉后继续提供服务。在这种情况下,一种可行的做法是:master:完全关闭持久化,这样可以让master的性能达到最好slave:关闭快照持久化,开启AOF(如果对数据安全要求不高,开启快照持久化关闭AOF也可以),并定时对持久化文件进行备份(如备份到其他文件夹,并标记好备份的时间);然后关闭AOF的自动重写,然后添加定时任务,在每天Redis闲时(如凌晨12点)调用bgrewriteaof。

Redis持久化方式的选择相关推荐

  1. Redis持久化方式之RDB

    目录 绪论 RDB RDB备份方式 自动备份 手动备份 实现过程 触发时机 恢复数据 RDB持久化配置 优缺点 实践演示 绪论 redis持久化机制主要是将内存中的数据持久化到磁盘文件中,一种是RDB ...

  2. redis 重新加载_Redis持久化和Redis持久化方式

    1.啥是Redis持久化 持久化就是把内存中的数据存到硬盘中去,防止进程退出后数据丢失. 分析:redis 如果仅仅只是将数据缓存在内存里面,如果 redis 宕机了再重启,内存里的数据将全部丢失.为 ...

  3. 【Redis】9.10.Redis持久化方式之RDBAOFAOF和RDB区别场景分析

    持久化简介 什么是持久化 利用永久性存储介质将数据进行保存,在特定的事件将保存的数据进行恢复的工作机制称为持久化 为什么要持久化 防止数据的意外丢失,确保数据安全性 持久化的过程保存什么 将当前数据状 ...

  4. Redis 持久化方式

    Redis 提供了两种持久化方式:RDB (默认) 和 AOF. RDB 内存快照,简而言之,就是在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上 AOF 日志文件:AOF的全称 ...

  5. 详述Redis持久化方式

    1.概述 Redis支持RDB(Redis DataBase)和AOF(Append Only File) 两种持久化机制,默认开启RDB机制,生成名为dump.rdb的数据文件,该文件存放在redi ...

  6. Redis持久化方式~RDB 持久化和AOF 持久化

    持久化 Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上. RDB 持久化 将某个时间点的所有数据都存放到硬盘上. 可以将快照复制到其它服务器从而创建具有相同 ...

  7. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  8. redis数据丢失_有效避免数据丢失!Redis持久化方案选择详解

    为什么需要持久化呢? 通常情况下redis的数据全部存储在内存中,数据库一旦故障发生重启数据会全部丢失,即使是在redis cluster或者redis sentinel模式下主从同步数据的恢复仍然需 ...

  9. redis 之redis持久化rdb与aof

    redis是内存型的数据库 重启服务器丢失数据 重启redis服务丢失数据 断电丢失数据 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种 ...

最新文章

  1. EDA电子设计技术与应用
  2. linux下mysql无法访问_Linux系统下无法访问mysql怎么办
  3. 前端分离的前端开发工具_使我成为前端开发人员工作的工具和资源
  4. 树莓派开发2-静态库,动态库,wiringpi库
  5. n阶乘的c语言代码,求10000的阶乘(c语言代码实现)
  6. Monte Carlo仿真方法的基本思想及其特点
  7. gc.collect()==>python的强制垃圾收集机制(不建议使用强制回收,因为可能导致错误)
  8. 如何将应用程序分为三个主要层
  9. 利用python语言实现帧差法,python+opencv实现帧差法
  10. django pdf转html5,pytho pdfkit 将网页django2.0教程内容打印成pdf文档
  11. UDP Socket编程
  12. linux线程互踩,IOS 多线程漫漫谈(Process and Thread)
  13. 图像叠加文字(点阵字库)原理解析
  14. 计算机视觉 — BOF图像检索
  15. LightningChart JS Crack,2D 和 3D JavaScript 图表
  16. 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
  17. asp毕业设计——基于asp+access的网上远程教育网设计与实现(毕业论文+程序源码)——网上远程教育网
  18. SKYCC组合营销软件的特色
  19. vue noVNC实现远程桌面连接
  20. 以枯草芽孢杆菌孢子制造出新冠口服疫苗,香港科研团队重大生物技术突破

热门文章

  1. Geek的入门神器:micropython-能跑python的stm32开发板
  2. 造字工房全套正版精美中文设计字体免费下载使用 (个人非商用/全集打包)
  3. Java语言学校的危险性(译文)
  4. TechEd2007现场侧记:TechEd的变与不变
  5. php 重载等号,重载运算符
  6. c语言中二维数组怎么,c语言中什么是二维数组
  7. MySQL 高级 - 索引 - 概述
  8. 优化器是怎么得到执行计划的?
  9. 使用Zookeeper实现leader选举
  10. 思考如何保证线程并行的数据安全性