深入理解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 ...
随机推荐
- Git学习总结三(工作区和暂存区、撤销修改)
工作区和暂存区 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: 版本库(Repository) 工作区有一个隐藏目录.git, ...
- 构建秘钥对验证的SSH体系
构建秘钥对验证的SSH 体系 首先先要在ssh 客户端以root用户身份创建秘钥对 客户端将创建的公钥文件上传至ssh服务器 服务器将公钥信息导入用户root的公钥数据库文件 客户端以root用户身份 ...
- react typescript 子组件调用父组件
//父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...
- 计蒜客 劫富济贫 (Trie树)
链接 : Here! 思路 : Trie树裸题, 由开始给出的名字建一棵字典树, 然后每次查询一下抢♂劫的人名是否在字典树中, 复杂度也不清楚是多少, 反正是没给出 $M$ 的范围, 开始时用 $ha ...
- uva 540 (Team Queue UVA - 540)
又是一道比较复杂的模拟题.题中有两种队列,一种是总队列,从前向后.其他的是各个团体的小队列,因为入队的人如果有队友的话,会优先进入团体队列. 所以我们先设置两个队列和一个map,设置map倒是可以不用 ...
- 38.histogram的基础用法
主要知识点 histogram的理解及用法 histogram:他的作用是把一些连续的数据划分为一定的区间范围,使用连续的数据离散化,然后这这样离散化的数据就可以做聚合分析操作,操作过程类似于 ...
- css图片居中(水平居中和垂直居中)
css图片居中(水平居中和垂直居中) css图片居中分css图片水平居中和垂直居中两种情况,有时候还需要图片同时水平垂直居中,下面分几种居中情况分别介绍. css图片水平居中 利用margin: 0 ...
- BZOJ 1724 USACO 2006 Nov. 切割木板
倒过来的合并果子? 做法与合并果子一样 维护一个小根堆,每次取出最小的两个数进行合并 #include<cstdio> #include<algorithm> #include ...
- hdu2011 多项式求和【C++】
多项式求和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- RestEasy 用户指南----第7章 @HeaderParam
转载说明出处:http://blog.csdn.net/nndtdx/article/details/6870391 原文地址 http://docs.jboss.org/resteasy/docs/ ...