引语

Redis作为一款内存数据库,自然所有数据都加载在内存中,那么自然就有小伙伴会问,如果服务器宕机了怎么办,数据不都丢了吗,不用担心,Redis早就提供了两种方式来将数据进行持久化,即便服务器宕机,在Redis重启后,数据也能恢复过来。这两种方式分别是RDB持久化和AOF持久化,那么这两种方式各有什么优劣、该如何配置、怎么去选择呢?请看下文:

RDB

RDB持久化实际上将Redis中的数据做了一份快照到本地文件中、定期备份,备份流程如下:

  1. 判定触发了备份条件,过了指定时长并更新了指定数量的Key,则准备备份;
  2. 调用系统函数中的fork(),创建一个子进程,执行fork的时候操作系统会使用copy-on-write策略,即fork函数父子进程共享同一内存数据,当父进程要更改其中的某片数据时,操作系统会将该数据复制一份从而保证子进程的数据不受影响,所以rdb中的数据时fork那一刻时的内存数据;
  3. 子进程将数据写入到一个临时的rdb文件中;
  4. 子进程写入完成后使用新的rdb文件替换旧的rdb文件。

从上面的流程我们可以看出,RDB备份的效率比较高,如果发生宕机恢复的速度也很快。但是如果服务器发生宕机,没来得及写入磁盘的数据则会丢失;同时,在fork时,如果数据集比较大,也可能会阻塞一段时间Redis,所以对于数据安全性要求较高的可以考虑后面一种方式aof。相关配置:


################################ 快照 ################################# # 保存数据库到磁盘
# save 秒 更新次数
# 当秒和更新次数同时满足时,则执行RDB导出操作 save 900 1 # 过900秒后数据库发生了至少1个Key值改变则进行RDB操作
save 300 10 # 过300秒后数据库发生了至少10个Key值改变则进行RDB操作
save 60 10000 # 过60秒后数据库发生了至少10000个Key值改变则进行RDB操作 # 在默认情况下,当RDB操作被激活且持久化失败时,Redis是否停止接受更新操作
# 因为需要用户了解到数据并没有正确持久化,如果没人注意这个问题,将是一个灾难
# 当然如果你已经合理配置了Redis服务器的监视和备份,可以关掉此功能
stop-writes-on-bgsave-error yes # 是否使用LZF压缩,使用了LZF压缩后的数据文件会比较小
# 如果你想节省一部分子进程的cpu消耗可以关闭此功能,但是会产生比较大的数据文件
rdbcompression yes # 为了防止文件损坏,此选项可以追加一个循环冗余校验码(CRC64)到快照文件的末尾
# 但是他会消耗约10%的cpu,如果对性能追求极致,可以设置为no
rdbchecksum yes # 导出的rdb文件名称
dbfilename dump.rdb # 导出的rdb文件存储目录
dir ./

AOF

AOF会以日志的形式记录服务器所处理的每个写、删除操作到文本中,具体步骤如下:

  1. 客户端发送写命令;
  2. 服务端同步写命令道AOF文件中;

从操作步骤上来看,aof的方式无疑更为安全,但由于每一步操作都需要记录下来,效率相对低下,且会产生非常巨大的数据文件,恢复起来也很慢,相关配置如下:

# 是否打开aof日志功能
appendonly no # aof文件存放路径与文件名称
appendfilename appendonly.aof # always:每一个命令都同步到aof文件中去
# everysec:每秒写一次数据到aof文件中去
# no:交由操作系统判定缓存区大小,统一写入aof
# 相比之下always最安全,但是由于每次都要写入,开销大,速度慢;no的速度最快,但是同步频率比较低,容易丢失数据
#appendfsync always/everysec/no # 在RDB操作时,是否停止aof操作,停止时,系统会等待rdb完成后,一次性将这期间的命令写入到aof中去
no-appendfsync-on-rewrite no # 配置是否重写aof命令,该命令与auto-aof-rewrite-min-size配合使用,由于我们每次操作都会记录到aof文件中,那么aof文件就会变得非常庞大
# 例如我们对一个key进行了1000次set操作,最后他的结果是10,那么aof就会记录1000次,如果能根据数据库将这些操作合并为set key 10就好了
# 使用这个命令可以保证当aof增长是原来的100%时,则发生重写,这样就会大幅缩小aof文件的大小,也会提升aof的数据恢复效率
auto-aof-rewrite-percentage 100
# 当aof文件大于64mb时重写
auto-aof-rewrite-min-size 64mb

到这里想必大家也对于持久化有了基本的认识了,顺便推荐一本《Redis 设计与实现》翻资料的时候发现的,很适合入坑。

深入理解Redis(番外)——持久化的更多相关文章

  1. 深入理解Redis系列之持久化

    redis持久化配置 redis.conf // RDB配置 save 900 1 save 300 10 save 60 10000 // AOF配置 appendonly yes //AOF三种同 ...

  2. C++雾中风景番外篇:理解C++的复杂声明与声明解析

    在学习C系列语言的过程之中,理解C/C++的复杂声明一直是初学者很困扰的问题.笔者初学之时也深受困扰,对很多规则死记硬背.后续在阅读<C专家编程>之后,尝试在编译器的角度来理解C/C++的 ...

  3. 10分钟彻底理解Redis持久化和主从复制

    在这篇文章,我们一起了解 Redis 使用中非常重要的两个机制:Reids 持久化和主从复制. 什么是 Redis 持久化? Redis 作为一个键值对内存数据库(NoSQL),数据都存储在内存当中, ...

  4. 一篇文章彻底理解Redis持久化:RDB和AOF

    为什么需要持久化? Redis对数据的操作都是基于内存的,当遇到了进程退出.服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复.有了持久化机制,Redis在下次重启时可以 ...

  5. 读完这篇,让你真正理解Redis持久化

    什么叫持久化? 用一句话可以将持久化概括为:将数据(如内存中的对象)保存到可永久保存的存储设备中. 持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中. XML 数据文件中等等. 也 ...

  6. 深入理解redis持久化

    持久化方式: 快照(RDB)方式,默认方式,文件以二进制方式保存到RDB文件. 文件追加(AOF)方式,文件以协议文本的方式write到AOF文件. 作用,重启后的数据恢复.当两种方式都启用时,red ...

  7. 理解Redis持久化

    本文首发于:https://mp.weixin.qq.com/s/WVUGWuNrGoyY_7aDf7NNmA 微信公众号:后端技术指南针 0.前言 通俗讲持久化就是将内存中的数据写入非易失介质中,比 ...

  8. 源码级别理解 Redis 持久化机制

    文章首发于公众号"蘑菇睡不着",欢迎来访~ 前言 大家都知道 Redis 是一个内存数据库,数据都存储在内存中,这也是 Redis 非常快的原因之一.虽然速度提上来了,但是如果数据 ...

  9. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  10. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

随机推荐

  1. xamarin.forms模拟rem动态大小值,实现屏幕适配

    开发app的时候,比较麻烦的地方,就是处理屏幕适配,比如文字设为12的大小,测试的时候,看得文字挺正常,可是,放到高分辨率设备一看,文字就变得特别小, 怎样实现随着分辨率变大或者变小,所有的size数 ...

  2. Python3爬取前程无忧数据分析工作并存储到MySQL

    1.导入包import requests #取数from lxml import etree #用xpath解析import pymysql #连接数据库import chardet #自动获取编码2 ...

  3. 《啊哈算法》中P81解救小哈

    题目描述 首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q).其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径. 此时摆在小哼面前的路有两 ...

  4. python爬虫12 | 爸爸,他使坏,用动态的 Json 数据,我要怎么搞?

    在前面我们玩了好多静态的 HTML 想必你应该知道怎么去爬这些数据了 但还有一些常见的动态数据 比如 商品的评论数据 实时的直播弹幕 岛国动作片的评分 等等 这些数据是会经常发生改变的 很多网站就会用 ...

  5. java web 基本属性

    page指令 属性 描述 默认值 language 指定JSP页面使用的脚本语言 java import contenType include指令 taglib注释 <!--我是html注释-- ...

  6. mysql 源码 王恒 [mysql数据结构+mysql 执行计划]

    http://blog.chinaunix.net/uid/26896862/cid-156733-list-1.html http://www.it168.com/redian/wangheng/

  7. install pip 回顾

    在install pip的时候遇到如下问题 1. yum install 想安装一个package 总是提示没有package 可以安装. 但是后来可以了 2. make 和 configure 到底 ...

  8. 解决vim粘贴时格式混乱的问题

    vim 粘贴时格式混乱的问题,是由于缩进导致的. --------------------------------------------------------------- 原文: http:// ...

  9. 以&quot;小刀会“的成败论当今创业成败

    讲起"小刀会",熟悉的人或许非常熟悉,不熟悉的人或许根本不知道清末有这样一个组织. 依据翻查史料,最初的小刀会是在福建成立的,来源有两个.一个是天地会的分支,一个是白莲教分支. 而 ...

  10. axis实现webservices分布式通信

    分布式通信原理 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2ZsMjAxMjEzMTQ=/font/5a6L5L2T/fontsize/400/fil ...