深入理解Redis(番外)——持久化
引语
Redis作为一款内存数据库,自然所有数据都加载在内存中,那么自然就有小伙伴会问,如果服务器宕机了怎么办,数据不都丢了吗,不用担心,Redis早就提供了两种方式来将数据进行持久化,即便服务器宕机,在Redis重启后,数据也能恢复过来。这两种方式分别是RDB持久化和AOF持久化,那么这两种方式各有什么优劣、该如何配置、怎么去选择呢?请看下文:
RDB
RDB持久化实际上将Redis中的数据做了一份快照到本地文件中、定期备份,备份流程如下:
- 判定触发了备份条件,过了指定时长并更新了指定数量的Key,则准备备份;
- 调用系统函数中的fork(),创建一个子进程,执行fork的时候操作系统会使用copy-on-write策略,即fork函数父子进程共享同一内存数据,当父进程要更改其中的某片数据时,操作系统会将该数据复制一份从而保证子进程的数据不受影响,所以rdb中的数据时fork那一刻时的内存数据;
- 子进程将数据写入到一个临时的rdb文件中;
- 子进程写入完成后使用新的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会以日志的形式记录服务器所处理的每个写、删除操作到文本中,具体步骤如下:
- 客户端发送写命令;
- 服务端同步写命令道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(番外)——持久化的更多相关文章
- 深入理解Redis系列之持久化
redis持久化配置 redis.conf // RDB配置 save 900 1 save 300 10 save 60 10000 // AOF配置 appendonly yes //AOF三种同 ...
- C++雾中风景番外篇:理解C++的复杂声明与声明解析
在学习C系列语言的过程之中,理解C/C++的复杂声明一直是初学者很困扰的问题.笔者初学之时也深受困扰,对很多规则死记硬背.后续在阅读<C专家编程>之后,尝试在编译器的角度来理解C/C++的 ...
- 10分钟彻底理解Redis持久化和主从复制
在这篇文章,我们一起了解 Redis 使用中非常重要的两个机制:Reids 持久化和主从复制. 什么是 Redis 持久化? Redis 作为一个键值对内存数据库(NoSQL),数据都存储在内存当中, ...
- 一篇文章彻底理解Redis持久化:RDB和AOF
为什么需要持久化? Redis对数据的操作都是基于内存的,当遇到了进程退出.服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复.有了持久化机制,Redis在下次重启时可以 ...
- 读完这篇,让你真正理解Redis持久化
什么叫持久化? 用一句话可以将持久化概括为:将数据(如内存中的对象)保存到可永久保存的存储设备中. 持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中. XML 数据文件中等等. 也 ...
- 深入理解redis持久化
持久化方式: 快照(RDB)方式,默认方式,文件以二进制方式保存到RDB文件. 文件追加(AOF)方式,文件以协议文本的方式write到AOF文件. 作用,重启后的数据恢复.当两种方式都启用时,red ...
- 理解Redis持久化
本文首发于:https://mp.weixin.qq.com/s/WVUGWuNrGoyY_7aDf7NNmA 微信公众号:后端技术指南针 0.前言 通俗讲持久化就是将内存中的数据写入非易失介质中,比 ...
- 源码级别理解 Redis 持久化机制
文章首发于公众号"蘑菇睡不着",欢迎来访~ 前言 大家都知道 Redis 是一个内存数据库,数据都存储在内存中,这也是 Redis 非常快的原因之一.虽然速度提上来了,但是如果数据 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- Redis两种持久化方式(RDB&AOF)
爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...
随机推荐
- 【原】Python学习_Django搭建环境及创建第一个项目
1.Window 平台安装 Python 下载安装包 https://www.python.org/downloads/windows/ 2.Pyhton环境变量配置 右键点击"计算机 ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列
Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...
- 洛谷——P2574 XOR的艺术
P2574 XOR的艺术 很久之前就想挑战一下这道题了,线段树下传标记的入门题,跟区间加法下传标记类似. #include<bits/stdc++.h> #define N 1000005 ...
- 洛谷——P3906 Geodetic集合
P3906 Geodetic集合 题目描述 图G是一个无向连通图,没有自环,并且两点之间至多只有一条边.我们定义顶点v,u最短路径就是从v到u经过边最少的路径.所有包含在v-u的最短路径上的顶点被称为 ...
- web前端学习总结--CSS
CSS 什么是CSS? CSS 指层叠样式表(Cascading Style Sheets) 样式定义如何显示HTML元素 样式通常存储在样式表中 如何使用CSS 内联方式 样式定义在单个的HTML元 ...
- file.seek()/tell()-笔记
---------------------------------------------------------------------------------------------------- ...
- hdu2017 字符串统计【C++】
字符串统计 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- python库文件路径
python中import语句导入库文件路径可通过sys.path查看.写一个简单的小程序: import sys print sys.path 运行它,本机上得到的结果如下: ['', '/usr/ ...
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...
- Java下用Jackson进行JSON序列化和反序列化(转)
Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...