Redis中RDB和AOF持久化区别和联系
RDB和AOF持久化
RDB持久化
RDB是什么?
原理是redis会单独创建(fork) 一个与当前进程一模一 样的子进程来进行持久化,这个子进程的所有数据(变量。环境变量,程序程序计数器等)都和原进程一模一 样,会先将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的io操作,这就确保了极高的性能
1.这个持久化文件在哪里
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
2. 触发机制
既然RDB机制是通过把某个时刻的所有数据生成一个快照来保存,那么就应该有一种触发机制,是实现这个过程。对于RDB来说,提供了三种机制:save、bgsave、自动化。我们分别来看一下
save:该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止
bgsave:该命令是非阻塞,后台持久化数据,Redis会在后台异步进行快照操作,不影响写操作。
自动化:
在redis.conf配置文件中,里面有如下配置,我们可以去设置:
默认如下配置:
#表示900秒内如果至少有1个key的值变化,则保存save9001#表示300秒内如果至少有10个key的值变化,则保存save30010#表示60秒内如果至少有10000个key的值变化,则保存save6010000
不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能。
RDB 的优势和劣势:
- 容易丢失数据,最高可能丢失59秒数据,当save6010000命令:突然断电,可能会丢失前59s持久化的临时数据文件 
- RDB文件紧凑,全量备份,占用空间少。 
AOF原理:
全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。
1.触发机制(根据配置文件配置项)
appendfsync no:表示等操作系统进行数据缓存同步到磁盘(快, 持久化没保证)
appendfsync always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢, 安全)
appendfsync everysec:表示每秒同步一次(默认值,很快, 但可能会丢失一秒以内的数据)
2.aof重写机制
其实就是瘦身,清除没用的日志记录
AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。
重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
什么时候会启动重写机制:
#当AOF文件增长到一定大小的时候Redis能够调用BGREWRITEAOF 对日志文件进行重写。当AOF文件大小的增长率大于该配置项时自动开启重写。
auto一aof一rewrite一percentage 80
#当AOF文件增长到一定大小的时候Redis能够调用BGREWRITEAOF 对日志文件进行重写。当AOF文件大小大于该配置项时自动开启重写
auto一aof一rewrite一min一size 64M(一般的公司最低5G)
3. 优缺点
(1)对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大
(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
(3)以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。
RDB和AOF最大区别
rdb:会frok子进程
aof:不会frok子进程,重写机制会frok子进程
Redis中RDB和AOF持久化区别和联系的更多相关文章
- 对比 Redis 中 RDB 和 AOF 持久化
		概念 Redis 是内存数据库,数据存储在内存中,一旦服务器进程退出,数据就丢失了,所以 Redis 需要想办法将存储在内存中的数据持久化到磁盘. Redis 提供了两种持久化功能: RDB (Red ... 
- redis的 rdb 和 aof 持久化的区别 [转]
		aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ... 
- redis的 rdb 和 aof 持久化的区别
		aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ... 
- Redis之RDB和AOF持久化介绍
		什么是数据库状态 redis是一个键值对的数据库服务器,服务器中通常包含中任意个非空的数据库,而每个数据库又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及他们的键值对统称为数据库状 ... 
- redis的rdb与aof持久化机制
		Redis提供了两种持久化方案:RDB持久化和AOF持久化,一个是快照的方式,一个是类似日志追加的方式 RDB快照持久化 RDB持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘 ... 
- Redis - 2 - 聊聊Redis的RDB和AOF持久化 - 更新完毕
		1.RDB 1.1).RDB是什么? RDB,全称Redis Database RDB是Redis进行持久化的一种方式,当然:Redis默认的持久化方式也是RDB 1.2).Redis配置RDB 1. ... 
- Redis的RDB和AOF持久化
		RDB 持久化:在指定的时间间隔内生成数据集的时间点快照. AOF 持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. RDB 它只保存了 Redis 在某个 ... 
- Redis持久化机制 RDB和AOF的区别
		一.简单介绍 Redis中的持久化机制是一种当数据库发生宕机.断电.软件崩溃等,数据库中的数据无法再使用或者被破坏的情况下,如何恢复数据的方法. Redis中共有两种持久化机制 RDB(Redis D ... 
- 搞懂Redis RDB和AOF持久化及工作原理
		前言 因为Redis的数据都储存在内存中,当进程退出时,所有数据都将丢失.为了保证数据安全,Redis支持RDB和AOF两种持久化机制有效避免数据丢失问题.RDB可以看作在某一时刻Redis的快照(s ... 
随机推荐
- 详细解析Java虚拟机的栈帧结构
			欢迎关注微信公众号:万猫学社,每周一分享Java技术干货. 什么是栈帧? 正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器.虚拟机栈.本地方法栈.堆和方法区.(什么?你还不知道,赶紧去看看 ... 
- java.sql.SQLException: connection holder is null 问题处理
			问题描述 上上个周测试的时候突然报系统异常,于是我立即查看日志,发现是一个数据库异常:java.sql.SQLException: connection holder is null我第一想到的就是可 ... 
- java main 方法
			public static void main(String[] args) { BigDecimal b1 = new BigDecimal(0.01000000); BigDecimal b2 = ... 
- MyEclipse导出war包丢失文件问题解决
			这两天忙于一项目的上线,现总结一下遇到的一个奇怪问题的解决方案. 公司用的是Windows系统的服务器,所以省去了很多linux的繁琐命令.部署工作简单了很多.一切准备结束,放上War包启动服务器后, ... 
- Djaingo 日志配置
			1.setting.py文件 # 项目级别的日志配置 BASE_LOG_DIR = os.path.join(BASE_DIR, "log") LOGGING = { 'versi ... 
- C#中TripleDES对应Java中的DESede即大家说的3DES,附C#及Java加解密结果一致的控制台程序例子
			直接上代码了. Java控制台代码: package Test; import java.security.Key; import javax.crypto.Cipher; import javax. ... 
- c#数字图像处理(二)彩色图像灰度化,灰度图像二值化
			为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移植到彩色图像上.24位彩色图像每个像素用3个字节表示,每个字节对应着R.G.B分量的亮度(红.绿 ... 
- requests快速构造请求头的方法
			上图请求头内容,内容多不说,也不确认哪些数据是必须的,网上找到一个懒办法 快速一键生成 Python 爬虫请求头 实战演练 抓取网站:https://developer.mozilla.org... ... 
- QDialog
			QDialog设置setWindowFlags(Qt::FramelessWindowHint);后,dialog弹不出来,界面不显示: 在继承一个QDialog类并设置窗口为无边框时,如果调用set ... 
- postman发送请求的简单操作
			发送请求常用的是post和get 两者的区别是: 1.post比get安全,因为参数直接暴露在url中,不能用来传递敏感信息 2.get参数通过url传递,post放在request body中 3. ... 
