Redis之Redis持久化
Redis(Remote Dictionary Server)是一个可持久化的内存、Key-Value数据库。
作为内存数据库,为了防止因服务器断电或系统宕机而引起的数据丢失问题,Redis自带了持久化功能,就是将内存中的数据同步到磁盘来保证持久化(防止数据丢失)。
Redis支持两种持久化方式:RDB(redis database)和AOF(append only file)。
- RDB(redis database)持久化
概念:在指定的时间间隔内将内存中的数据集快照(Snapshot)写入磁盘,待服务重启时,将快照文件读入内存中。
原理:在执行持久化时,redis使用Fork的方式单独创建一个进程来进程持久化,该进程会先将内存中的数据写入到一个临时文件中,待持久化结束时,用此临时文件替换掉上次持久化保存的文件(默认的文件名为dump.rdb)。
Fork原理:复制一个与当前进程一样的进程,新进程的所有数据都与原进程一样,但是一个全新的进程,并作为原进程的子进程。
触发条件: 可以通过 redis命令 或者配置 redis.conf 文件来指定redis持久化的时机。
(1)使用命令
save ( 立刻redis数据持久化,其他全部阻塞 )
bgsave ( redis会在后台异步进行快照操作,同时还可响应客户端的请求,可用命令 lastsave 获取最后一次成功执行快照的时间 )
flushall ( 清空命令也会触发持久化操作,但dump.rdb文件中是空的,无意义)
shutdown ( 关闭数据库命令也会触发redis持久化操作 )
(2)使用 redis.conf 配置文件
相关配置位于 redis.conf 文件中的 "SNAPSHOTTING" 配置部分:save <seconds> <changes> 指定在 seconds 秒内有 changes 次跟新操作,就进行一次持久化。
禁用RDB持久化: 可以通过 redis命令 或者配置 redis.conf 文件来禁用 RDB持久化
(1)使用命令
redis-cli config set save ""
(2)使用 redis.conf 配置文件
相关配置位于 redis.conf 文件中的 "SNAPSHOTTING" 配置部分,设置 save "" 配置时,代表禁用RDB持久化。
持久化文件:位于 redis.conf 文件中的 "SNAPSHOTTING" 配置部分:
dir 参数配置持久化文件的目录,dbfilename 参数配置持久化参数的名称。
恢复持久化文件:将备份文件移动至 dir 参数配置持久化文件的目录下,并将文件名改为 dbfilename 参数配置持久化参数的文件名,然后启动数据库即可恢复数据。
若 dump.rdb 文件存在异常,数据恢复将报错。可使用命令 redis-check-dump --fix <filename> 命令对 dump.rdb 持久化文件进行修复,然后重启redis服务即可。
优点:持久化过程中,主进程不进行任何IO操作,对于大规模的数据恢复,具有极高的性能。
缺点:RDB最后一次持久化后的数据可能会因为redis意外down掉而丢失最后一次快照后修改的所有数据;
Fork时,内存数据被克隆,大致2倍的膨胀性,会对服务器造成一定的压力,影响性能。
应用:适合大规模数据恢复,且对恢复数据的完整性、一致性不是很严格,这种情况下RDB比AOF更加高效。
- AOF(append only file)持久化
原理:以日志的形式来记录每个写操作(读操作不记录),只许追加文件,不可改写文件,redis启动时,将根据日志文件内容将写指令从前到后执行一次以完成数据的恢复。
触发条件: 可以通过配置 redis.conf 文件来指定redis持久化的时机。
默认AOF持久化时关闭的,将参数值设置为 yes 即开启AOF持久化。
appendfsync 参数用于指定同步频率,具体使用如下图。
持久换文件:位于 redis.conf 文件中的 "SNAPSHOTTING" 配置部分:
dir 参数同时也配置 AOF持久化文件的目录;
appendfilename 参数(上图中)用来指定 AOF持久化文件的文件名。
恢复持久化文件:
保证 redis.conf 文件中 dir 参数 指定的目录下存在与 appendfilename 参数配置的文件名相同的.aof文件,重启服务时即可恢复。
当同时开启 AOF 和 RDB 两种持久化时,启动服务时,会优加载 AOF 持久化文件进行数据的恢复。
若 AOF文件存在异常,数据恢复将报错。可使用命令 redis-check-aof --fix <filename> 命令对 .aof 持久化文件进行修复,然后重启redis服务即可。
AOF持久化文件Rewrite重写机制:
引入重写机制背景:AOF采用文件追加的方式,将导致文件越来越大,故新增重写机制。当AOF文件大小超过所设置的阈值时,Redis将启动AOF内容压缩,只保留可以恢复数据的最小指令集。
重写原理:当AOF文件大小持续增长超过配置参数 设置的阈值时,redis将fork出一条新进程来将文件重写(也是先将内容写入临时文件,最后再rename)。重写AOF文件时,并不是参照旧的AOF文件,而是遍历新进程内存中的数据,每条记录都添加一条set语句,从而重写一个新的AOF文件,只保留可以恢复数据的最小指令集,类似于快照。
触发机制:可以通过 redis命令 或者配置 redis.conf 文件来配置Rewrite时机
(1)使用命令 bgrewriteeaof
(2)使用配置文件:redis会记录上一次重写AOF文件的大小。默认配置是当AOF文件大小是上次重写后大小的一倍且文件大于64M触发重写操作。具体配置如下图:
优点:可以设置appendfsync 为 每秒同步 每次修改同步 和不同步,最恶劣情况下,丢失不超过两秒的数据
缺点:相同数据集的数据,AOF文件远大于RBD文件,且恢复速度慢于RBD;AOF运行效率慢于RBD,每秒同步策略效率较好,不同步效率和RDB相同;AOF在rewrite过程中将新数据写到新文件中造成的阻塞是不可避免的。
- RDB和AOF使用指南
建议AOF和RDB同时开启;
RDB作为后备用途,备份频率设置为 : save 900 1;
减少AOF文件的rewrite频率, 设置重写的基准值: auto-aof-rewrite-min-size 5G auto-aof-rewrite-percentage 100。
生产使用策略:
(1)使用 Master-Slave 主从复制策略;
(2)Slaver上使用RDB方式持久化,策略为 save 900 1 ;
(3)Master上依据实际情况决定是否使用AOF,如使用,建议重写基础大小设置为5G,重写百分比依据实际确定。
Redis之Redis持久化的更多相关文章
- Redis两种持久化方式(RDB&AOF)
爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...
- Redis提供的持久化机制(RDB和AOF)
Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...
- Redis学习手册(持久化)
一.Redis提供了哪些持久化机制: 1). RDB持久化: 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘. 2). AOF持久化: 该机制将以日志的形式记录服务 ...
- Redis 学习之持久化机制、发布订阅、虚拟内存
一.持久化机制 Redis是一个支持持久化的内存数据库,redis会经常将内存中的数据同步到硬盘上来保证数据持久化,从而避免服务器宕机数据丢失问题,或者减少服务器内存消耗提高性能. 持久化方式: 1. ...
- Redis学习——Redis持久化之AOF备份方式保存数据
新技术的出现一定是在老技术的基础之上,并且完善了老技术的某一些不足的地方,新技术和老技术就如同JAVA中的继承关系.子类(新技术)比父类(老技术)更加的强大! 在前面介绍了Redis学习--Redis ...
- Redis学习——Redis持久化之RDB备份方式保存数据
从这一个介绍里面知道,redis比memcache作为缓存数据库强大的地方,一个是支持的数据类型比较多,另一个就是redis持久化功能. 下面就介绍Redis的持久化之RDB! 一:什么是redis的 ...
- Redis管理之持久化
Redis的一大重要特征就是支持持久化. Redis提供了两种不同的持久化方式:RDB和AOF. RDB持久化可以在指定的时间间隔内生成数据集的快照.由于是定期的生成数据集的快照,所以,如果服务器出现 ...
- flask+apscheduler+redis实现定时任务持久化
在我们开发flask的时候,我们会结合apscheduler实现定时任务,我们部署到服务器上,会不会遇到这样的问题,每次我们部署后,我们重启服务后,原来的定时任务都需要重启,这样对我们经常迭代的项目肯 ...
- redis两种持久化方法对比分析
1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...
- redis学习--的持久化数据备份(RDB和AOF)
接上一篇:安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目 一.dump.rdb文件是怎么生成的 二.什么是redis持 ...
随机推荐
- Protocol Buffer学习笔记
Protocol Buffer Protobuf基础概念 Protobuf是google开发的数据结构描述语言,能够将结构化数据序列化与反序列化,取代json和xml,常用于服务器通信协议.RPC系统 ...
- .net core系列之《.net core中使用MySql以及Dapper》
当我们决定使用.Net Core开发的时候,就放弃使用SqlServer的打算吧.那应该选择哪个数据库呢?一般选择MySql的比较多. 接下来我们来演示在.Net Core中使用MySQL吧. 1.原 ...
- .net core系列之《.net core中使用集成IDistributedCache接口的Redis和MongoDB实现分布式缓存》
分布式的缓存可以提高性能和可伸缩性的 ASP.NET Core 应用程序,尤其是托管在云中或服务器场中时. 什么是分布式的缓存 分布式的缓存由多个应用程序服务器共享,缓存中的信息不存储在单独的 Web ...
- 装饰器( decorate )
装饰器分步解释-形成过程: #-*- coding: UTF-8 -*- #示例1: def deco(p_args): def pack(): print('haha,i am deco fun') ...
- Java学习---JAVA的类设计
基础知识 JAVA是由C/C++语言发展而来的纯面向对象语言,其基本元素包括:简单数据类型 和 复合数据类型(即类).类是对客观事物的抽象描述,它有面向对象的四个特点,即:封装性.继承性.多态性和通信 ...
- 【MySQL】MySQL数据库再安装
解决问题 安装时提示此产品配置信息损坏,怎么办? 环境检测时未响应,怎么办? 服务不能启动,怎么办? 输入密码不能登陆,不使用密码却能登录,是什么原因? 涉及到的错误代码:windows启动MySQL ...
- H5 签到功能
Introduce(介绍) 用户签到的H5例子(css+jquery,无图片),由于网上找的的用户签到例子都不好,要不就是好多图片组成的,要不就大量冗余代码,所以特意做了个签到界面(移动端). Use ...
- [EffectiveC++]item02:尽量以const,enum,inline代替#define
- Codeforces Round #439 (Div. 2)【A、B、C、E】
Codeforces Round #439 (Div. 2) codeforces 869 A. The Artful Expedient 看不透( #include<cstdio> in ...
- Spring Security 自定义配置(1)
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapte ...