Redis持久化

  • Redis持久化介绍
  • 二者的区别
  • 二者优缺点
  • 常用配置

Redis持久化介绍

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。那么这两种持久化方式有什么区别呢,改如何选择呢?网上看了大多数都是介绍这两种方式怎么配置,怎么使用,就是没有介绍二者的区别,在什么应用场景下使用。

二者的区别

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
RDB 可以将其类比于 游戏存档

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。 AOF 可以将其类比于 同声翻译

二者优缺点

RDB存在哪些优势呢?
1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

RDB又存在哪些劣势呢?

1). 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

AOF的优势有哪些呢?
1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

2). 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

AOF的劣势有哪些呢?

1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。

常用配置

RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:

save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

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

appendfsync always #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no #从不同步。高效但是数据不会被持久化。

Redis持久化 - 邱乘屹的个人技术博客相关推荐

  1. Redis的主从同步 - 邱乘屹的个人技术博客

    Redis的主从同步 redis主从原理 一.复制过程 二.数据间的同步 psync 命令需要 3 个组件支持: 主从节点各自复制偏移量: 主节点复制积压缓冲区: 主节点运行 ID: 如果在重启时不改 ...

  2. Python内存回收机制 - 邱乘屹的个人技术博客

    Python内存回收机制 引用计数 标记-清除 分代回收 由于面试中遇到了内存回收的问题,转载学习和总结这个问题. 我们从三个方面简单来了解一下Python的内存回收机制. 引用计数 当一个对象的引用 ...

  3. Linux快速安装Python3.6 - 邱乘屹的个人技术博客

    Linux快速安装Python3.6 下载 一些配置 最近在Linux系统下载python,发现因外网 普通下载速度极其缓慢,所以分享一个快速在Linux系统下安装python的小记 下载 #Cent ...

  4. Django和DRF - 邱乘屹的个人技术博客

    Django和DRF DRF的优势 DRF,全称Django Restful Framework,是一个基于Django的Restful接口框架,是主要用来做API接口的,为前端提供数据的接口 DRF ...

  5. 联合索引的意义,作用 - 邱乘屹的个人技术博客

    联合索引的意义,作用 什么是联合索引? 联合索引的意义 联合索引的作用 什么是联合索引? 联合索引 又称复合索引,是由多个字段组成的索引,联合索引遵循最左原则,联合索引适用于多条件查询. 联合索引的意 ...

  6. MySQL的优化 - 邱乘屹的个人技术博客

    MySQL的优化 MySQL的优化 为什么要MySQL优化? MySQL的优化 字段设计优化 适应遵循数据库三范式 引擎的选择 适应选择MyIsam & InnoDB 索引 索引也会消耗内存空 ...

  7. redis源码笔记 - initServer - 刘浩de技术博客 - 博客园

    redis源码笔记 - initServer - 刘浩de技术博客 - 博客园 redis源码笔记 - initServer - 刘浩de技术博客 - 博客园 redis源码笔记 - initServ ...

  8. php redis管道,php redis pipeline怎么用 - 翟码农技术博客

    网上一大堆文章都在说pipeline怎么提升性能,我只是想知道安装好phpredis库之后,代码上如何写来开启管道模式,也就是下面这一小撮代码而已.$pipe = $redis->multi(R ...

  9. redis源码笔记 - 刘浩de技术博客 - 博客园

    redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 记录发现的一个hiredis的bug 摘要: hiredis是redis ...

  10. Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET...

    Redis Primer(1)基于JedisPool的Redis hset并发性能测试 - @钟超 · 技术博客专栏 - 博客频道 - CSDN.NET Redis Primer(1)基于JedisP ...

最新文章

  1. winform运行时如何接受参数?(示例)
  2. spring resttemplate 中文参数_SpringBoot使用RestTemplate访问第三方接口
  3. 关于SVM,面试官们都怎么问
  4. MySQL最后一次查询耗时查询
  5. .net core redis 驱动推荐,为什么不使用 StackExchange.Redis
  6. python循环指令_Python循环
  7. Qt文档阅读笔记-Qt Core的官方解析
  8. Android Studio 复制粘贴图片到drawable文件夹没有效果 - 解决方法
  9. 美食合成海报,脑洞开得有点Hold不住!!
  10. R语言实现混频数据分析实例----midas回归预测
  11. php foreach是什么,php foreach用法是什么
  12. Linus Torvalds 命名 [ 冰封荒原 ] 版 Linux 内核的思考
  13. Android启动的init进程
  14. java并发编程实战读书笔记4--生产者消费者模式和队列
  15. ROST情感分析的语法规则_《自然语言处理入门》12.依存句法分析--提取用户评论...
  16. 知识图谱01:知识图谱的定义
  17. 信噪比db换算_DB和dBm有哪些区别 DB和dBm区别介绍【图文】
  18. 弘辽科技:淘宝直通车点击量是什么意思?直通车点击量怎么提升?
  19. 企业微信登录二维码样式修改
  20. Oracle ADR(Automatic Diagnostic Repository)介绍

热门文章

  1. Python对电影数据简单分析
  2. linux cp报错 扩展 失败,linux使用cp报错 Text file busy
  3. Python爬取堆糖网图片的代码
  4. python qq群发消息_Python版QQ群发消息
  5. 深度解读企业微信与个人微信的区别?
  6. 腾讯入股艺龙,在线旅游市场引发关注
  7. dreamweaver cs6 html5 pack,HTML5 Pack for Dreamweaver CS5——HTML5开发工具
  8. java软尾山地车评测_GT Sensor X Pro 软尾山地自行车测评
  9. 进销存系统的通用模型
  10. 用matlab编写SIR模型对SARS期间疫情数据进行模拟