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 ...
随机推荐
- Blazor WebAssembly 3.2.0 已在塔架就位 将发射新一代前端SPA框架
最美人间四月天,春光不负赶路人.在充满无限希望的明媚春天里,一路风雨兼程的.NET团队正奋力实现新的突破. 根据计划,新一代基于WebAssembly 技术研发的前端SPA框架Blazor 将于5月1 ...
- Springboot:员工管理之查询员工列表(十(6))
构建员工controller com\springboot\controller\EmployeeController.java package com.springboot.controller; ...
- leetcode-0101 对称二叉树
题目地址 https://leetcode-cn.com/problems/symmetric-tree/ 1.递归 本题最简单的思路是递归,可以假设两棵一模一样的树在进行镜像对比.他们之间的关系满足 ...
- 用SQL查询分析实现类似金蝶K3的收发存明细表
使用SQL查询分析实现类收发存的报表,原始需求在 另外一篇文章 的第四部分.下图是实现需求. 一.准备 删除临时表 [buy]判断是否存在临时表,存在则删除[/buy] if OBJECT_ID('t ...
- 十分钟通过一个实际问题,真正教会大家如何解决Bug
前言 这篇文章从实际问题 -> 问题解决步骤 -> 问题解决思路,帮助大家能够明白如何在程序中发现问题,定位问题,解决问题.并真正理解那些问题解决思路. 首先说说这个实际问题是什么,又是怎 ...
- 使用sqlmap结合dnslog快速注入
0x01 起因 实际项目中遇到一个oracle延时注入,需要获取数据,几十个库几百张表,等找到关键数据不知道要到哪天. 测试支持带外请求 于是想用使用sqlmap利用DNS进行OOB注入 0x02 阿 ...
- sqlilab less15-17
less15 试了很多符号,页面根本不显示别的信息,猜测为盲注 可是怎么检测闭合? 万能密码登录 最终试出来'闭合 uname=1' or 1=1 # 接下来就要工具跑 less16 同上用万能密码试 ...
- 文件上传漏洞(pikachu)
文件上传漏洞 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像,附件等等.当用户点击上传按钮后,后台会对上传的文件进行判断,比如是否是指定的类型.后缀名.大小等等,然后将其按照设 ...
- RSA,AES加解密算法的实现
目录 Python实现RSA公钥加密算法 RSA公钥加密算法原理 RSA算法的Python实现 AES加解密算法实现 AES加解密算法原理 AES加解密算法Python实现 参考文献 Python实现 ...
- java 8 stream reduce详解和误区
目录 简介 reduce详解 总结 java 8 stream reduce详解和误区 简介 Stream API提供了一些预定义的reduce操作,比如count(), max(), min(), ...