Redis数据持久化机制及数据恢复
什么是数据持久化?
我们知道Redis是基于内存的非关系型数据库,对数据的增删改查操作都直接在内存中进行,再加上Redis不用维护数据之间的“关系”,导致它性能很高,速度很快。
但是基于内存有一个问题是:一旦机器断电,内存中的数据会丢失。
数据丢失是很严重的问题,所以Redis是支持数据持久化的。
数据持久化:将内存中的数据写入到磁盘,数据永久保存。
Redis的持久化机制
Redis支持两种持久化机制:RDB和AOF,4.0版本以后还加入了混合持久化机制。
RDB持久化
RDB全称:Redis DataBase。
RDB是Redis默认的持久化机制,在指定的时间间隔内,进行了指定次数的写操作,Redis就会触发RDB持久化,RDB持久化的是数据的二进制文件,节省空间。
Redis会fork一个和主进程一模一样的子进程,子进程将内存中的所有数据先写入到一个临时文件中,持久化结束以后,将这个临时文件替换正式的dump.rdb文件,整个持久化的过程中主进程不进行任何磁盘IO操作,这就确保了Redis极高的性能。
持久化文件存放在哪里?
redis.conf文件中的dir配置的目录 + dbfilename配置的文件名。
RDB触发时机
- 在指定的时间间隔内,执行指定次数的写操作。
- 手动执行save、bgsave时。
- 执行FlushAll命令时,数据是空的,没有意义。
- shutdown时,如果没有开启AOF就会触发。
- 主从复制时。
save和bgsave
save
阻塞当前Redis服务,直到持久化完成,期间所有请求都会被阻塞,线上一般不使用。bgsave
Redis服务不受影响,fork一个子进程去异步的持久化,将内存数据写到到临时文件,持久化完成后替换dump.rdb文件。
RDB的优缺点
优点
- 性能高
- RDB文件占用空间小
- 数据恢复很快
缺点
- 数据完整性和一致性要求不高,可能丢失数据。
- 备份时占用内存,fork的子进程会让内存突然飙升。
AOF持久化
AOF全称:Append Only File。
AOF持久化在Redis中默认是关闭的,需要手动开启,AOF的出现是为了弥补RDB的不足。
AOF通过追加日志的方式来做持久化,将涉及到数据增删改的命令以日志的方式追加到aof文件中,Redis服务重启时执行一遍aof中的命令来完成数据的恢复。
如何开启AOF
修改配置文件,重启服务。
# 开启AOF
appendonly yes# aof文件名
appendfilename "appendonly.aof"# AOF触发时机:
# always 每次写操作都写入磁盘,效率低。
# everysec 每秒写入一次磁盘。
# no Redis不主动写磁盘,由操作系统来决定调用,线上不推荐使用。
# appendfsync always
appendfsync everysec
# appendfsync no
AOF重写机制
因为AOF文件存储的是命令,就导致它比较庞大,比rdb文件要大很多,Redis需要对其进行“瘦身”。
AOF重写就是对AOF文件进行“瘦身”,采用的方案是:将多条写操作优化为一条写操作,记录最终结果,而无需记录中间每一步的操作记录,重写之后AOF文件会小很多。
如下例子:
rpush a 1
rpush a 2
rpush a 3重写后:rpush a 1 2 3 (3条命令变成1条)
配置AOF重写策略
# 当AOF文件大小的增长率大于该配置项时触发重写。
auto-aof-rewrite-percentage 100# 当AOF文件大小大于此配置时,触发重写。线上环境要调大该值。
auto-aof-rewrite-min-size 64mb
手动触发AOF重写
BGREWRITEAOF
混合持久化机制
Redis4.0版本推出了混合持久化机制,5.0之前默认关闭,5.0版本已经默认开启了。
修改配置文件开启
aof-use-rdb-preamble yes
混合持久化是通过BGREWRITEAOF来实现的,未开启混合持久化时,AOF重写的方式是将多条指令优化为一条,开启混合持久化后,AOF前半段是RDB格式的二进制数据全量文件,后半段以日志命令的方式追加,AOF文件也采用混合存储。
数据恢复
Redis重启后,需要对数据进行恢复,将RDB/AOF中持久化的数据重新加载到内存,步骤大致如下图所示:
Redis数据持久化机制及数据恢复相关推荐
- Redis数据持久化机制AOF原理分析一---转
http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...
- Redis数据持久化机制AOF原理分析二
本文所引用的源码全部来自Redis2.8.2版本. Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c 在阅 ...
- 执行一次怎么会写入两次数据_Java进阶知识:一文详解缓存Redis的持久化机制,新手看完也会用
Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制. Redis有两种持久化的方式: ...
- Redis数据持久化、数据备份、数据的故障恢复
1.redis持久化的意义----redis故障恢复 在实际的生产环境中,很可能会遇到redis突然挂掉的情况,比如redis的进程死掉了.电缆被施工队挖了(支付宝例子)等等,总之一定会遇到各种奇葩的 ...
- redis rdb aof区别_理解Redis的持久化机制:RDB和AOF
什么是Redis持久化? Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示: 这样做有什么问题呢? 注 意 文末有:362 ...
- 面试官:能说说Redis的持久化机制吗?
我们先来看这么一段面试场景-- 面试官:你们项目缓存技术用到了什么缓存技术? 小帅:Redis 面试官:那么问一下,Redis缓存技术用到的持久化机制是哪一种机制? 小帅:AOF 面试官:好吧,回去等 ...
- Redis面试 - Redis的持久化机制
Redis面试 - Redis的持久化机制 面试题 redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的? 面试官心理分析 redis 如果仅仅只是将数据缓 ...
- redis rdb aof区别_10分钟彻底理解Redis的持久化机制:RDB和AOF
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:张君鸿 juejin.im/post/5d09a9ff51882577eb133aa ...
- redis的持久化机制详解
redis的持久化机制 因为Redis的数据都储存在内存中,当进程退出时,所有数据都将丢失.为了保证数据安全,Redis支持RDB和AOF两种持久化机制有效避免数据丢失问题.RDB可以看作在某一时刻R ...
最新文章
- c语言实现数码管显示qq号,各位大神,如何用C语言实现在数码管上实现1234同时亮...
- RMI、Hessian、Burlap、Httpinvoker、WebService的比较
- 修改默认的pip版本为对应python2.7
- CF1406E:Deleting Numbers(构造、根号分块)
- 四川大学计算机专业贵州分数线,四川大学2016年在贵州省高考各专业录取分数线...
- 【Julia】Julia v1.5.1 更改Pkg存放位置
- 网页设计图片向上浮动_果冻公开课第六课:5分钟理解浮动布局
- itunes备份包括哪些内容_建筑工程的招标包括哪些内容?
- Exynos4412开发板更换开机logo图片
- php搭建后台 xampp_你还在用wordpress?|搭建独一无二个人网络日志发布平台
- B/S还是C/S? ERP技术的新方向(转)
- ISO9000标准简介
- uci数据集汇总及翻译
- TAGE预测器 “A case for (partially) TAgged GEometric history length branch prediction”
- 刻在我心底的名字吉他谱-凡凡吉他教室编制
- Linux下安装压力测试工具hey、参数介绍、实例
- webpack打包工具不会用,那是因为你没看过这篇
- 如何用 CSS 制作动画圆环图形图标
- python发送邮件群发_Python发邮件脚本,Python调用163邮箱SMTP服务实现邮件群发
- linux的root用户默认密码,Linux下root初始密码设置方法
热门文章
- Android之屏幕适配方案
- linux服务器杀进程,linux杀死进程命令[通俗易懂]
- 微信电脑版 == 摸鱼神器?
- 绝地求生8月7号服务器维修吗,2019绝地求生8月7日更新官方公告 吃鸡8月7日更新了什么内容?...
- 爱单纯女孩十个必要条件
- 分类与预测算法评价标准
- python中值_Python中值,python,中位数
- mesh和wifi中继的区别_一文读懂:小米Wi-Fi6路由器上的Mesh到底是什么?
- docker离线安装使用yum
- 腾讯毛华:智能交互,AI助力下的新生态