Redis02——Redis内存数据如何保存到磁盘
在前一篇文章中,已经介绍了Redis的基础数据结构,这篇文章将继续介绍Redis的持久化原理。
简介
众所周知Redis的所有数据都存在于内存之中,这就会存在因内存问题而导致的数据丢失,为了避免这一问题,可采取Redis的持久化机制来解决这一问题。
详解
Redis持久化有两种方式,分别是RDB(又称快照)与AOF。对于两种方式各有优缺点,具体如下:
RDB:全量一次同步内存中所有序列化的二进制数据,同步慢,数据较小。
AOF:增量同步操作指令,同步较快,数据量随时间增加而增多,需定期进行AOF文件重写,以便减小日志文件。
RDB原理
SAVE:该命令会阻塞当前Redis服务,导致Redis服务不可用,直至RDB持久化进程完毕,所以一般都不采取该方式进行RDB持久化。
BGSAVE:当使用该命令进行RDB持久化时,Redis会fork产生一个子进程,由子进程进行RDB持久化操作,父进程接受客户端的操作请求。子进程只会遍历读取内存中的数据,写入磁盘,并不会修改数据,若父进程在子进程读取数据过后进行了数据修改,子进程就会与父进程存在数据不一致的问题。
Copy on Write:众所周知Redis是单线程程序,文件IO操作不能进行多路复用,于是在BGSAVE进行RDB持久化时Redis采用操作系统的Copy on Write机制进行RDB持久化。
单独使用RDB持久化,存在数据丢失风险
AOF原理
AOF日志存储的是,Redis执行的顺序写指令。当开启AOF持久化时,Redis会先执行数据的写指令,再将指令写入AOF日志中。
fsync:实际情况中,AOF机制会先将Redis写指令写入内存缓冲区中,再根据配置情况,定时调用fsync将缓冲区文件写入AOF日志中。我们可以根据实际情况设置fsync频率:
always:每次修改,立即提交磁盘。该方式数据完整性良好,但是IO开销大,影响效率.
everysec: 每秒同步一次到磁盘。该方式只会丢失一秒内的数据,
no: 从不同步到磁盘。
思考
从上述的原理中,可以看出无论是RDB还是AOF,都存在一定的缺点。
在日常操作中,一般都是从AOF日志中来恢复数据,因为RDB会丢失大量数据。但是AOF恢复数据又会花费较长时间。
于是从Redis4.0开始,Redis开始支持混合持久化。即将RDB与AOF结合使用,RDB负责定时全量持久化数据,AOF负责记录最后一次RDB后的增量日志。使得Redis的数据恢复在恢复效率与数据完整性之间取得一个完美的平衡点。
Redis系列推荐
Redis02——Redis内存数据如何保存到磁盘的更多相关文章
- redis内存数据的持久化方式
转: http://blog.csdn.net/wzqzhq/article/details/64920996 概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis ...
- redis持久化数据的机制——转发
转载:https://www.cnblogs.com/xingzc/p/5988080.html Redis提供的持久化机制(RDB和AOF) Redis提供的持久化机制 Redis是一种面向“k ...
- redis学习——数据持久化
一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内存中的数据持久 ...
- Redis之数据持久化RDB与AOF
Redis之数据持久化RDB与AOF https://www.cnblogs.com/zackku/p/10087701.html 大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内 ...
- 进阶的Redis之数据持久化RDB与AOF
大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内存数据库,它的操作都几乎基于内存.但是内存型数据库有一个很大的弊端,就是当数据库进程崩溃或系统重启的时候,如果内存数据不保存的话,里 ...
- Redis内存使用优化与存储
抄自http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage 本文将对Redis的常见数据类型的使用场景以 ...
- Redis内存使用优化与存储(转)
Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部 ...
- Redis 内存使用优化与存储
Redis 常用数据类型 Redis 最为常用的数据类型主要有以下五种: • String • Hash • List • Set • Sorted set 在具体描述这几种数据类型之前,我们先通过一 ...
- NoSQL数据库:Redis内存使用优化与存储
Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: ●String ●Hash ●List ●Set ●Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Re ...
随机推荐
- JAVA专业术语面试100问
前言:面试技巧另外开篇再说,先上面试干货吧.Redis.消息队列.SQL不要走开,关注后更精彩! 1.面向对象的特点有哪些? 抽象.继承.封装.多态. 2.接口和抽象类有什么联系和区别? 3.重载和重 ...
- Robustness|Variability|Diversification|Complexity|自组装|
生命组学 进化方向有以下四个特性:Robustness:变稳定,比如杀虫剂最大浓度也有杀不死的虫子.Variability易变性与Diversification多样性,容易变多和变多.Complexi ...
- linux下添加行数和修改tab空格数
在/etc/vimrc文件中添加: set nu set ts=4 保存即可
- java面试题 - 框架
1.servlet执行流程 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request.resp ...
- Qt foreach关键字用法
Qt提供一个关键字 foreach (实际是 <QtGlobal> 里定义的一个宏)用于方便地访问容器里所有数据项. foreach 关键字用于遍历容路中所有的项,使用 foreach 的 ...
- springboot 不同类型多数据源配置及使用
springboot多数据源配置: datasource.master.jdbc=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...
- MySQL树形结构的数据库表设计和查询
1.邻接表(Adjacency List) 实例:现在有一个要存储一下公司的人员结构,大致层次结构如下: 那么怎么存储这个结构?并且要获取以下信息: 1.查询小天的直接上司. 2.查询老宋管理下的直属 ...
- 查漏补缺:QT入门
1.什么世QT Qt是一个跨平台的C++图形用户界面应用程序框架,为应用程序开发者提供建立艺术级图形界面所需的所有功能.它是完全面向对象的,容易扩展,并且允许真正的组建编程. 2.支持平台 Windo ...
- Android APP性能及专项测试
移动测试. Android测试 .APP测试 Android篇 1. 性能测试 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试 Android的a ...
- Autotestplat体验中心
web端 移动端 可戳[阅读原文]进行体验