Redis学习笔记(八) RDB持久化
Redis是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将存储在内存中的数据库状态保存到磁盘,那么服务器 进程一旦退出,服务器中的数据库状态也会消失不见。
为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将数据库状态保存到磁盘里面
1、RDB文件的创建与载入
Redis可以使用SAVE或BGSAVE命令创建RDB文件。
SAVE命令会阻塞服务器进程,直到RDB文件创建完毕,在服务器阻塞过程中服务器不能处理任何命令,所以此时客户端发送来的命令都会被拒绝。
BGSAVE命令会派生一个子线程,然后由子线程负责创建RDB文件,服务器进程(主进程)继续处理命令。
RDB文件的载入是在服务器启动时自动执行,所以Redis并没有专门载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,它就会自动载入。
由于AOF文件的更新频率通常比RDB文件更新频率高,所以如果服务器开启了AOF,那么服务器优先从AOF文件还原数据库,只有AOF关闭时,服务器才会使用RDB文件还原数据库。
BGSAVE命令执行时,Redis服务器处理SAVE、BGSAVE、BGREWRITEAOF命令方式会与平时不同。
1、SAVE命令会被服务器拒绝,服务器禁止SAVE、BGSAVE命令同时执行,是为了避免主线程与子线程同时执行rdbSave产生竞争条件。
2、BGSAVE命令同样也会被拒绝,因为两个BGSAVE命令也会产生竞争条件。
3、BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕后执行,如果 BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝。
RDB文件载入时,服务器会处在阻塞状态,直到载入工作完成。
Redis使用BGSAVE命令自动间隔保存。

1、RDB文件的创建与载入
Redis可以使用SAVE或BGSAVE命令创建RDB文件。
SAVE命令会阻塞服务器进程,直到RDB文件创建完毕,在服务器阻塞过程中服务器不能处理任何命令,所以此时客户端发送来的命令都会被拒绝。
BGSAVE命令会派生一个子线程,然后由子线程负责创建RDB文件,服务器进程(主进程)继续处理命令。
RDB文件的载入实在服务器启动时自动执行,所以Redis并没有专门载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,它就会自动载入。
由于AOF文件的跟新频率通常比RDB文件更新频率高,所以如果服务器开启了AOF,那么服务器优先从AOF文件还原数据库,只有AOF关闭时,服务器才会使用RDB文件还原数据库。
BGSAVE命令执行时,Redis服务器处理SAVE、BGSAVE、BGREWRITEAOF命令方式会与平时不同。
1、SAVE命令会被服务器拒绝,服务器禁止SAVE、BGSAVE命令同时执行,是为了避免主线程与子线程同时执行rdbSave产生竞争条件。
2、BGSAVE命令同样也会被拒绝,因为两个BGSAVE命令也会产生竞争条件。
3、BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕后执行,如果 BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝。
RDB文件载入时,服务器会处在阻塞状态,直到载入工作完成。
Redis使用BGSAVE命令自动间隔保存。
struct redisServer{
//记录了保存条件的数组
struct saveparam *saveparams;
//修改计数器
long long diry;
//上一次执行保存的时间
time_t lastsave;
}
save选项的保存条件:
struct saveparam{
//秒数
time_t seconds;
//修改次数
int changes;
}
Redis的服务器周期性操作函数serverCron默认100毫秒执行一次,用于维护正在运行的服务器,他的一项工作就是检查save选项所设置的保存条件是否已经满足,如果满足则执行BGSAVE命令。

RDB文件结构

RDB文件中的数据库结构示例
Redis 标识时Redis数据库RDB文件
db_version 文件版本
selectdb 标识后面是查询的第几个数据库。
pairt 保存着该数据库的所有键值对以及过期时间
EOF 标识内容结束
check_sum 校验和,用来检测RDB文件是否正确有无损坏。
VALUE编码:
1、字符串对象
redis支持压缩存储,如果不压缩的情况下,存储len与字符串;如果压缩则结构如下:

REDIS_RDB_ENC_LZF常量标志着字符串被LZF算法压缩,读入陈旭在碰到这个常量时会根据compressed_len(压缩后长度),orgin_len(原长度)和compressed_string (压缩后字符串)三个部分,对字符串进行解压缩。
2、列表对象

list_length记录了列表长度。tiem每一项都是一个字符串,程序读入时按字符串对象读入。
3、集合对象 存储方式与列表对象相似。
4、哈希表对象

其中key_value_pair结构中的键值对以键紧挨值的方式排列。
5、有序结合对象

每天学一点,总会有收获。
说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。


Redis学习笔记(八) RDB持久化的更多相关文章
- Redis学习笔记六:持久化实验(AOF,RDB)
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- Redis学习笔记八:独立功能之二进制位数组
Redis 提供了 setbit.getbit.bitcount.bitop 四个命令用于处理二进制位数组. setbit 命令用于为位数组指定偏移量上的二进制位设置值,偏移量从 0 开始计数. ge ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- redis学习笔记(3)
redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...
- redis 学习笔记-cluster集群搭建
一.下载最新版redis 编译 目前最新版是3.0.7,下载地址:http://www.redis.io/download 编译很简单,一个make命令即可,不清楚的同学,可参考我之前的笔记: red ...
- Redis学习笔记(二) Redis 数据类型
Redis 支持五种数据类型:string(字符串).list(列表).hash(哈希).set(集合)和 zset(有序集合),接下来我们讲解分别讲解一下这五种类型的的使用. String(字符串) ...
- Redis学习笔记4-Redis配置具体解释
在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...
随机推荐
- Stream—一个早产的婴儿
当你会关注这篇文章时,那么意味着你对Stream或多或少有些了解,甚至你在许多业务中有所应用.正如你所知,业界对Stream.lambda褒贬不一,有人认为它是银弹,也有人认为其降低了代码的可读性.事 ...
- 【MyBatis深入剖析】应用分析与最佳实践(下)
MyBatis编程式开发 MyBatis编程式开发步骤 MyBatis和MySQL Jar包依赖 全局配置文件mybatis-config.xml 映射器Mapper.xml Mapper接口 编程式 ...
- Java IO 流 -- 设计模式:装饰设计模式
在java IO 流中我们经常看到这样的写法: ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream(ne ...
- 五分钟学会Python装饰器,看完面试不再慌
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第12篇文章,我们来看看Python装饰器. 一段囧事 差不多五年前面试的时候,我就领教过它的重要性.那时候我Pyt ...
- vagrant + 宝塔 环境搭建遇到的一些问题
1.js时间戳单位为毫秒,php时间戳为秒. 2.tp里的where()方法如果where("id=".$id)不能用的话就用数组形式的:where(array("id& ...
- DEDE Fatal error: Maximum execution time of 30 seconds exceeded 致命 错误: 最大的 执行 时间 为 30 秒
刚安的DEDE 5.7 -SP1-GBK的 为何一登录后台点任何链接都显示超过30秒 后台假死 网上搜的方法一般都是更改执行时间上限,其目的是为了解决一些大的数据,真的需要30秒以上的执行时 ...
- 2019.11.13课堂实验之用Linux下的shell脚本完成两文本交替输出
有两个文本如下,实际中并不知道两文本各有多少行: 文本1.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ccccccccccccccccccccccccccc ...
- Linux网络服务第五章NFS共享服务
1.笔记 NFS一般用在局域网中,网络文件系统c/s格式 服务端s:设置一个共享目录 客户端c:挂载使用这个共享目录 rpc:111远程过程调用机制 Showmount -e:查看共享目录信息 def ...
- nginx开启ssl并把http重定向到https的两种方式
1 简介 Nginx是一个非常强大和流行的高性能Web服务器.本文讲解Nginx如何整合https并将http重定向到https. https相关文章如下: (1)Springboot整合https原 ...
- Python 正则表达式——re模块介绍
Python 正则表达式 re 模块使 Python 语言拥有全部的正则表达式功能,re模块常用方法: re.match函数 re.match从字符串的起始位置匹配,如果起始位置匹配不成功,则matc ...