Redis 设计与实现 (三)--持久化
RDB 持久化
一、生成RDB
cmd:SAVE --阻塞进程,执行完,才能有效接收客户端命令。
cmd: BGSAVE --非阻塞,开启子进程保存。
客户端如果发送SAVE和BGSAVE命令直接拒绝。
BGWRITEAOF命令再BGSAVE执行完才能执行。
二、载入RDB
服务器启动时自动执行,检测到RDB文件就会自动加载。
如果开启AOF,优先使用执行AOF。
AOF关闭的情况下,才会执行RDB。
三、自动间隔性保存
save设置:一定条件后执行BGSAVE命令进行保存
默认设置:
save 900 1 //900秒内,进行一次修改,触发保存BGSAVE
save 300 1 //300秒内,10次修改,触发保存BGSAVE
save 60 10000 //60秒内,1w次修改,触发保存BGSAVE
struct saveparam {
time_t seconds; //秒数
int changes;//变化次数
};
还有两个参数:
dirty --上次数据库触发保存命令修改数
lastsave -- 最后一次执行save时间
PORT_LONGLONG dirty; /* Changes to DB from the last save */
time_t lastsave; /* Unix time of last successful save */
还有一个定时器默认100毫秒来检测是否满足save条件的方法:serverCron
int serverCron(struct aeEventLoop *eventLoop, PORT_LONGLONG id, void *clientData)
四、RDB文件结构
| REDIS | db_version | database | EOF | check_sum |
RDB文件开头是REDIS,来判定是否是RDB文件。
db_version 版本号
databse 包含任意多个数据库(键值对)
EOF RDB文件结束标志
check_sum 校验长度
AOF 持久化
一、命令持久化,保存redis 的写命令
二、命令追加
redis 执行完写命令,将命令按照一定协议格式追加到 aof_buf 缓冲区
sds aof_buf; /* AOF buffer, written before entering the event loop */
三、AOF文件写入与同步
resid 服务器进程是一个事件循环
文件事件:接受命令和输出内容
时间事件:负责定时任务
文件事件执行写命令,这样会追加命令到aof_buf 缓冲区,在这写命令结束之前会调用flushAppendOnlyFile 函数判断是否从缓冲区回写到AOF文件。
写入策略有三个:
always: 将aof_buf 缓冲区所有内容写入并同步到AOF文件。
everysec(默认): 将缓冲区内容写入,超过一秒钟,并进行同步。
no: 将缓冲区的所有内容同步,但是不同步。
四、AOF 载入以及数据还原
1、创建一个伪客户端
2、分析aof文件 并解析一条命令
3、伪客户端执行此命令
4、循环执行2和3
五、AOF重写
AOF 存储写命令,体积会膨胀,恢复数据库的时间也会变长。
新建文件AOF ,去除冗余命令,合并命令。达到缩减文件目的。
六、AOF后台重写
处理命令请求会因为这个aof重写造成阻塞。
另起一个子进程,进行aof重写。但是会存在数据不一致的问题,子进程在处理重写一条命令后,同时主进程依然在写当操作对象的命令。造成数据不一致。
解决方案:开辟aof重写缓存区
命令会直接写入aof缓存区和aof重写缓存区,这样可以读取缓存区命令进行处理。类似队列,先写入队列进行待处理。
生成的写命令-->aof缓冲区 -->写入同步到aof文件
生成的写命令-->aof重写缓冲区 --> 写完 -->发送信号给父进程 --> aof重写缓冲区写入新aof文件 -->原子覆盖旧aof文件
父进程处理命令,保存aof,使用子进程,覆盖重写aof,达到性能最佳不阻塞,同时生成的新aof也是比较小。
Redis 设计与实现 (三)--持久化的更多相关文章
- Redis设计与实现 (三): 字典
哈希表 结构定义dict.h/dictht /* * 哈希表 * * 每个字典都使用两个哈希表,从而实现渐进式 rehash . */ typedef struct dictht { // 哈希表数 ...
- redis源码分析(三)--rdb持久化
Redis rdb持久化 Redis支持两种持久化方式:rdb与aof.rdb将一个节点上的内存数据序列化后存储到磁盘中,序列化的数据以尽可能节约空间的方式存储,并非完全的ascii表示.它的优点在于 ...
- 探索Redis设计与实现11:使用快照和AOF将Redis数据持久化到硬盘中
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Redis基础篇(三)持久化:AOF日志
Redis是内存数据库,但是一旦服务器宕机,内存中的数据将会全部丢失. 最简单的恢复方式是从后端数据库恢复,但这种方式有两个问题: 频繁访问数据库,会给数据库带来巨大的压力: 从数据库中读取相比从Re ...
- Redis | 第5章 Redis 中的持久化技术《Redis设计与实现》
目录 前言 1. RDB 持久化 1.1 RDB 文件的创建与载入 1.2 自动间隔性保存 1.2.1 设置保存条件 1.2.2 dirty 计数器和 lastsave 属性 1.2.3 检查保存条件 ...
- 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- Redis设计与实现2.2:数据持久化
数据持久化 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 RDB持久化 RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原 ...
- Redis设计与实现(一~五整合版)【搬运】
Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...
- 《Redis设计与实现》读书笔记
<Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...
- 深入学习Redis(2):持久化
前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化.复制(及读写分离).哨兵.以及集群. 本文将先说明上述几种技术分别解决了Redis高可 ...
随机推荐
- Flume-ng高可用集群负载安装与配置
1. 写在前面 flume-ng高可用长在大数据处理环节第一个出现,对于处理日志文件有很好的作用,本篇博客将详细介绍flume-ng的高可用负载均衡搭建 2. flume-ng高可用负载均衡描述 在一 ...
- 学习现代 JavaScript 编程的最佳教程
天天编码 , 版权所有丨本文标题:0.0 学习现代 JavaScript 编程的最佳教程 转载请保留页面地址:http://www.tiantianbianma.com/the-modern-java ...
- 基于ASP.NET MVC 下的Extjs的Combbox加载速率问题,终于解决啦:)
在实际的开发项目中,自己遇到一个让自己苦恼很久的问题,一直也未解决,先简单介绍一下这个问题吧.当在表单里有多个combbox的时候(表单中的combbox是经过封装的控件,从后台请求同一个方法获取数据 ...
- html_之css
css 有三种形式的写法: 直接在标签里写入style样式 在<head></head>里写入<style></style>样式 直接创建.css 文件 ...
- [Python]CentOS - ImportError: No module named '_curses'
网上搜了不少答案, 基本都是说Windows环境下curses包不适用的问题. 作为碰到这个问题的linux用户,实在感到无奈. 起因是在CentOS上部署uwsgi,想要使用uwsgitop来监控. ...
- webstorm2018.2.3激活
一,简介 WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.目前已经被广大中国JS开发者誉为"Web前端开发神器"."最强大的HTML5编 ...
- MyBatis(四)多参数处理问题
这里总结了关于多参数传递时,MyBatis接收的三种方式. (1)接口中编写方法 public Emp getEmpByParams(Integer id,String lastNmae); publ ...
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
- 定位方式(d16)
一,回顾, ①selector和xpath的区别,selector是解析的html,xpth是解析的xml,所以使用selector比使用xpath快, ②定位元素的单数和复数,当使用单数定位不到元素 ...
- ajax(2)
AJAX全称: Asynchronous JavaScript and XML ( 异步的JavaScript 和 XML) Ajax的本质就是:XMLHttpRequest 对象: 案例: v ...