1.简单介绍一下Redis

Redis是使用C语言开发的数据库,不过与传统数据库不同的是Redis的数据是存在内存中的,也就是内存数据库,读写速度非常的快,因此Redis被广泛应用于缓存方向。

2.Redis 持久化机制

        很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后回复数据),或者是为了防止系统故障而将数据备份到一个远程位置。

1)快照(snapshotting)持久化

Redis可以通过创建快照来获得存储在内存里面的数据在某时间点上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使用。

        快照持久化是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1                 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 300 10                 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 60 10000                 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

根据配置,快照将被写入dbfilename选项指定的文件里面,并存储在dir选项指定的路径上面。如果在新的快照文件创建完毕之前,Redis、系统或者硬件这三者中的任意一个崩溃了,那么Redis将丢失最近一次创建快照写入的所有数据。

举例:假设Redis的上一个快照是2:35开始创建的,并且已经创建成功。下午3:06时,Redis又开始创建新的快照,并且在下午3:08快照创建完毕之前,有35个键进行了更新。如果在下午3:06到3:08期间,系统发生了崩溃,导致Redis无法完成新快照的创建工作,那么Redis将丢失下午2:35之后写入的所有数据。另一方面,如果系统恰好在新的快照文件创建完毕之后崩溃,那么Redis将丢失35个键的更新数据。

创建快照的方法:

  • BGSAVE命令: 客户端向Redis发送 BGSAVE命令 来创建一个快照。对于支持BGSAVE命令的平台来说(基本上所有平台支持,除了Windows平台),Redis会调用fork来创建一个子进程,然后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。

  • SAVE命令: 客户端还可以向Redis发送 SAVE命令 来创建一个快照,接到SAVE命令的Redis服务器在快照创建完毕之前不会再响应任何其他命令。SAVE命令不常用,我们通常只会在没有足够内存去执行BGSAVE命令的情况下,又或者即使等待持久化操作执行完毕也无所谓的情况下,才会使用这个命令。

  • save选项: 如果用户设置了save选项(一般会默认设置),比如 save 60 10000,那么从Redis最近一次创建快照之后开始算起,当“60秒之内有10000次写入”这个条件被满足时,Redis就会自动触发BGSAVE命令。

  • SHUTDOWN命令: 当Redis通过SHUTDOWN命令接收到关闭服务器的请求时,或者接收到标准TERM信号时,会执行一个SAVE命令,阻塞所有客户端,不再执行客户端发送的任何命令,并在SAVE命令执行完毕之后关闭服务器。

  • 一个Redis服务器连接到另一个Redis服务器: 当一个Redis服务器连接到另一个Redis服务器,并向对方发送SYNC命令来开始一次复制操作的时候,如果主服务器目前没有执行BGSAVE操作,或者主服务器并非刚刚执行完BGSAVE操作,那么主服务器就会执行BGSAVE命令。

如果系统真的发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。因此,快照持久化只适用于即使丢失一部分数据也不会造成一些大问题的应用程序。不能接受这个缺点的话,可以考虑AOF持久化。

2)AOF(append-only file)持久化

与快照持久化相比,AOF持久化 的实时性更好,因此已成为主流的持久化方案。默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:

appendonly yes 

开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof。

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always     #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec   #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no         #让操作系统决定何时进行同步

        appendfsync always 可以实现将数据丢失减到最少,不过这种方式需要对硬盘进行大量的写入而且每次只写入一个命令,十分影响Redis的速度。另外使用固态硬盘的用户谨慎使用appendfsync always选项,因为这会明显降低固态硬盘的使用寿命。

为了兼顾数据和写入性能,用户可以考虑 appendfsync everysec选项 ,让Redis每秒同步一次AOF文件,Redis性能几乎没受到任何影响。而且这样即使出现系统崩溃,用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候,Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。

        appendfsync no 选项一般不推荐,这种方案会使Redis丢失不定量的数据而且如果用户的硬盘处理写入操作的速度不够的话,那么当缓冲区被等待写入的数据填满时,Redis的写入操作将被阻塞,这会导致Redis的请求速度变慢。

        虽然AOF持久化非常灵活地提供了多种不同的选项来满足不同应用程序对数据安全的不同要求,但AOF持久化也有缺陷——AOF文件的体积太大。

重写/压缩AOF

AOF虽然在某个角度可以将数据丢失降低到最小而且对性能影响也很小,但是极端的情况下,体积不断增大的AOF文件很可能会用完硬盘空间。另外,如果AOF体积过大,那么还原操作执行时间就可能会非常长。

为了解决AOF体积过大的问题,用户可以向Redis发送 BGREWRITEAOF命令 ,这个命令会通过移除AOF文件中的冗余命令来重写(rewrite)AOF文件来减小AOF文件的体积。

BGREWRITEAOF命令和BGSAVE创建快照原理十分相似,所以AOF文件重写也需要用到子进程,这样会导致性能问题和内存占用问题,和快照持久化一样。更糟糕的是,如果不加以控制的话,AOF文件的体积可能会比快照文件大好几倍。

文件重写流程:

和快照持久化可以通过设置save选项来自动执行BGSAVE一样,AOF持久化也可以通过设置

auto-aof-rewrite-percentage

选项和

auto-aof-rewrite-min-size

选项自动执行BGREWRITEAOF命令。举例:假设用户对Redis设置了如下配置选项并且启用了AOF持久化。那么当AOF文件体积大于64mb,并且AOF的体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行BGREWRITEAOF命令。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

无论是AOF持久化还是快照持久化,将数据持久化到硬盘上都是非常有必要的,但除了进行持久化外,用户还必须对持久化得到的文件进行备份(最好是备份到不同的地方),这样才能尽量避免数据丢失事故发生。如果条件允许的话,最好能将快照文件和重新重写的AOF文件备份到不同的服务器上面。

随着负载量的上升,或者数据的完整性变得 越来越重要时,用户可能需要使用到复制特性。

3)Redis 4.0 对于持久化机制的优化

Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。

如果把混合持久化打开,AOF 重写的时候就直接把 RDB 的内容写到 AOF 文件开头。这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据。当然缺点也是有的, AOF 里面的 RDB 部分就是压缩格式不再是 AOF 格式,可读性较差。

Redis持久化机制相关推荐

  1. redis的通用命令 || redis持久化机制:(RDB  ||  AOF)

    通用命令 1. keys * : 查询所有的键         2. type key : 获取键对应的value的类型         3. del key:删除指定的key value 持久化   ...

  2. Redis持久化机制(RDB VS AOF)

    Redis持久化机制 Redis持久化机制由来 一.RDB机制 1.1 工作原理 1.2 RDB的配置 1.3 修改RDB配置的快照策略 1.3.1 自定义RDB持久化策略 1.3.2 服务宕机RDB ...

  3. Redis系列:Redis持久化机制与Redis事务

    Redis 是个基于内存的数据库.那服务一旦宕机,内存中数据必将全部丢失.所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作 ...

  4. Redis系列之Redis持久化机制

    Redis持久化机制 为什么要持久化 如果Redis再次访问时,发现Redis的数据是空的,就会形成缓存穿透.更重要的是,因为Redis的数据是空的,所以客户端想要访问的key都没有,就会造成大量的请 ...

  5. Redis持久化机制 -全量同步与增量同步的区别

    全量同步与增量同步的区别 全量同步:就是每天定时(避开高峰期)或者采用一个周期实现将数据拷贝到一个地方也就是Rdb存储. 增量同步:比如采用对行为的操作实现对数据的同步,也就是AOF. 全量与增量的比 ...

  6. 缓存使用-4、Redis 持久化机制

    一.redis启动时载入持久化文件的流程. 二.redis两种持久化机制 两种持久化机制是RDB和AOF机制,下面介绍下是什么和优缺点. RDB持久化是指用数据集快照的方式记录redis数据库的所有键 ...

  7. redis持久化机制,深入分析redisAOF和RDB模式的利弊

    文章目录 写在前面 日志文件-AOF AOF的格式 AOF的写入方式 三种写回策略 AOF 中开启 always 刷盘策略也会存在数据丢失吗? AOF配置为每秒刷盘,有可能阻塞Redis,影响性能吗? ...

  8. Redis系列(五)Redis持久化机制

    文章目录 Redis持久化 为什么需要持久化 RDB 概念 触发条件(什么时候触发?) 自动触发 手动触发 通过RDB文件恢复数据 优势 不足 AOF 概念 同步机制 重写机制 重写过程 重写触发条件 ...

  9. Redis持久化机制——随记2

    引言 Redis官方提供了两种不同的持久化方法来将数据存储到硬盘里面分别是: (1)快照(Snapshot) (2)AOF (Append Only File)只追加日志文件 1.快照机制 1.1.特 ...

最新文章

  1. 花33元租号玩2小时王者荣耀,未成年为绕过防沉迷用上黑科技上号器App
  2. html native code is rendered from xml configuration
  3. 使用OC语言批量修改文件名称
  4. jzoj1247-队列变换【字符串hash,二分】
  5. java动态代理二cglib
  6. TensorFlow strides 参数讨论
  7. dedecms php用不了,织梦DEDECMS安装360漏洞补丁之后不能够运行PHP代码的问题
  8. omnet++tictoc12案例解析
  9. 网络地址转换—NAT——总结
  10. PD,LGD,EAD
  11. java.lang.UnsatisfiedLinkError解决方法汇集(转载)
  12. Coloring Contention
  13. C++ 开发中如何利用sql语句(insert语句)向数据库中插入变量
  14. BUUCTF others babystack
  15. 维护高 Star Github 项目,会遇到什么有趣的问题 2022 版
  16. 清除session ,清除cookie
  17. CStyle足迹:一个BIOS人的成长日记之开篇
  18. openstack官方安装文档的解析--环境配置篇(1)
  19. 阿里内部Android笔记火爆IT圈,已拿offer入职
  20. 冲压模具材料的选用及热处理要求

热门文章

  1. 进制转换:二进制、八进制、十六进制、十进制之间的转换
  2. 快速识别手机质量的好坏
  3. 这么做,让基木鱼转化翻倍
  4. js获取到的时间减1秒或加1秒
  5. tenserflow
  6. 清明上河图-分解图[珍藏]
  7. 华夏名网虚拟主机如何导入mysql/mssql数据库,怎样自已导入数据到华夏名网数据库
  8. python 期权量化交易_Python量化期权怎么学?
  9. 华科考研834计算机网络,2017华科834考研真题试卷及答案.pdf
  10. 京东——实时数仓治理与实战