Redis持久化存储(RDB和AOF)
参考了: https://blog.csdn.net/canot/article/details/52886923 和 https://www.cnblogs.com/zhangchao-letv/articles/6122921.html 两篇文档
在看redis的事务处理的ACID属性,其中的一致性中提到了当Redis进程被终止:
如果Redis服务器进程在执行事务的过程中被其他进程终结,或者被管理员强制杀死,那么根据Redis所使用的持久化模式,可能出现以下情况:
- 内存模式:如果Redis没有采取持久化机制,那么重启之后的数据库总是空白的,所以数据总是一致的。
- RDB模式:在执行事务时,Redis不会中断事务去执行保存RDB的工作,只有在事务执行之后,保存RDB的工作才有可能开始,所以当RDB模式下的Redis服务器进程在事务中途被杀死时,事务内执行的命令,不管成功了多少,都不会被保存到RDB文件里。恢复数据库需要使用现在的RDB文件,而这个RDB文件的数据保存的是最后一次的数据库快照(snapshot),所以他的数据可能不是最新的,但只要RDB文件本身没有因为其他问题而出错,那么还原之后的数据库就是一致的。
- AOF模式:因为保存AOF文件的工作在后台线程进行,所以即使是在事务执行的中途,保存AOF文件的工作也可以继续进行,因此,根据事务语句是否被写入并保存到AOF文件,会有以下两种情况:
- 如果事务语句未写入到AOF文件,或者AOF未被SYNC调用保存到磁盘,那么当进程被杀死之后,Redis可以根据最近一次成功保存到磁盘的AOF文件来还原数据库,只要AOF文件本身没有因为其他问题而出错,那么还原后的数据库总是一致的,但其中的数据不一定是最新的。
- 如果事务的部分被写入的AOF文件,并且AOF文件被成功保存,那么不完整的事务执行信息就会遗留在AOF文件里面,当重启Redis时,程序会检测到AOF文件并不完整,Redis会退出,并报告错误。需要使用Redis-check-aof工具将部分成功的事务命令移除之后,才能再次启动服务器。还原之后的数据总是一致的,而且数据也是最新的(知道事务执行之前为止)
RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。
RDB 持久化功能所生成的RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB 文件时的数据库状态。
因为生成的RDB文件是保存在硬盘中的,所以当Redis进程退出,或者是Redis停机,但只要RDB文件存在,那么数据都可以还原状态。
Redis的RDB存储的优缺:
- 优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能
- 缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
这里说的这个执行数据写入到临时文件的时间点是可以通过配置来自己确定的,通过配置redis在n秒内如果超过m个key被修改这执行一次RDB操作。这个操作就类似于在这个时间点来保存一次Redis的所有数据,一次快照数据。所有这个持久化方法也通常叫做snapshots。
配置文件在相应的redis.conf里
save 900 1 #在900s内超过1个key被修改
save 300 10 #在300s内超过10个key被修改
save 60 10000 #在60s内超过10000个key被修改
snapshot出触发的时机,是有“间隔时间”和“变更次数”共同决定的,同时符合两个条件才能出发snapshot,否则“变更次数”会被继续累加到下一个的时间间隔上,snapshot过程中并不阻塞客户端请求。snapshot首先将数据写入临时文件,当成功结束后,将临时文件重名为dump.rdb。
RDB变更计数器:
除了saveparams数组之外,服务器状态还维持着一个dirty计数器,以及一个lastsave属性:
dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态(服务器中的所有数据库)进行了多少次修改(包括写入、删除、更新等操作)。
lastsave属性是一个UNIX时间戳,记录了服务器上一次成功执行SAVE命令或者BGSAVE命令的时间。
当服务器成功执行一个数据库修改命令之后,程序就会对dirty计数器进行更新:命令修改了多少次数据库.dirty计数器的值就增加多少。
例如,如果我们为一个字符串键设置值:
redis>SET message "hello"
OK
那么程序会将dirty计数器的值增加1。
又例如,如果我们向一个集合键增加三个新元素:
redis>SADD database Redis MongoDB MariaDB
(integer) 3
Redis持久化存储(RDB和AOF)的更多相关文章
- Redis 持久化之RDB和AOF
Redis 持久化之RDB和AOF Redis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File).如果你想快速了解和使用RDB和AOF,可以直 ...
- 详解Redis持久化(RDB和AOF)
详解Redis持久化(RDB和AOF) 什么是Redis持久化? Redis读写速度快.性能优越是因为它将所有数据存在了内存中,然而,当Redis进程退出或重启后,所有数据就会丢失.所以我们希望Red ...
- redis持久化(RDB、AOF、混合持久化)
redis持久化(RDB.AOF.混合持久化) 1. RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中. 你可以对 Redis ...
- redis学习(四)redis持久化之RDB、AOF
redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失.为了解决这个问题,re ...
- Redis持久化(RDB和AOF)
什么是Redis持久化 什么是Redis持久化,就是将内存数据保存到硬盘. Redis 持久化存储 (AOF 与 RDB 两种模式) RDB持久化 RDB 是以二进制文件,是在某个时间 点将数据写入一 ...
- Redis基础(三)Redis持久化:RDB与AOF
什么是Redis持久化? Redis是键值对的内存数据库,它将数据存储在内存里.客户端发送命令到服务器,再由服务器到内存里查找数据. 一旦Redis服务器进程退出,存储在内存里的数据就会丢失. 为了解 ...
- Redis持久化存储——>RDB & AOF
Redis中两种持久化存储机制RDB和AOF redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB ...
- Redis持久化之RDB与AOF
1. Redis的持久化方式 Redis作为高效的缓存件,它的数据存放在内存中,如果没有配置持久化,那么数据会在重启后丢失,因此如果不是仅用Redis做缓存的话,需要开启Redis的持久化功能,将数据 ...
- Redis持久化方式RDB和AOF
Redis 持久化 RDB(快照) 优点 rdb是可进行压缩的二进制文件,表示Redis在某一个时间点的数据快照.非常使用与备份,灾难恢复等场景.比如使用定时任务执行bgsave并备份rdb到serv ...
随机推荐
- Java并发编程之深入理解线程池原理及实现
Java线程池在实际的应用开发中十分广泛.虽然Java1.5之后在JUC包中提供了内置线程池可以拿来就用,但是这之前仍有许多老的应用和系统是需要程序员自己开发的.因此,基于线程池的需求背景.技术要求了 ...
- CORS & X-Frame-Options
CORS & X-Frame-Options X-Frame-Options https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers ...
- XShell中文乱码问题解决
现象:XShell终端中输入中文显示乱码 原因:XShell终端的编码格式与服务器不同 解决:修改XShell终端的编码格式:菜单中点击,文件->属性->终端->编码,选择“UTF- ...
- maven的pom.xml举例
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- ssm框架配置过程
1.pom.xml配置 1.1<build>标签中配置<plugins>和<resources>,即插件和资源文件 1.2 <properties>标签 ...
- Win32+API学习笔记:创建基本的窗口控件
创建一个标签 CreateWindowEx(0, "static", "姓名:", ...
- 神奇:java中float,double,int的值比较运算
float x = 302.01f; System.out.println(x == 302.01); //false System.out.println(x == 302.01f); // ...
- keystone v3.0与2.0的区别
参看http://blog.chinaunix.net/uid-21335514-id-3497996.html
- 【leetcode】 Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- SQL语句(八)按条件查询
SELECT * FROM student SELECT sclass, snumb, sname FROM student --物理班有哪些同学 --年龄小于20岁的有哪些同学? --定价在30元以 ...