浅谈:Redis持久化机制(一)RDB篇

​ 众所周知,redis是一款性能极高,基于内存的键值对NoSql数据库,官方显示,它的读效率可达到11万次每秒,写效率能达到8万次每秒,因为它基于内存以及存读效率高的特性,在市场上的应用中一般都把它作为缓存来使用,同时这也意味着它不能大量的无限制的填充数据,否则容易内存填满,导致redis会向硬盘申请虚拟内存,造成内存和外存的不断I/O,致使效率低下,甚至引起宕机,那么问题来了,既然只是当做缓存而不是为了永久存储数据,redis为什么要做持久化呢?这样做有什么意义呢?

1.为什么要做持久化

  • 第一点要明确,redis作为内存数据库,宕机后就会发生数据消失,之所以要去做持久化只是为了能在重启之后快速的恢复数据,而不是存储数据;redis的持久化并不能够保证数据的完整性.
  • 当然,如果要把redis当做DB用,DB数据要完整,所以需要一个完整的数据源(比如mysql),当启动时将数据源的数据全部加载到redis里面,这只适用于数据量小的不易改变的,比如:字典库。像mysql那样大量的存储数据时行不通的。

2.RDB(redis database)

​ 说完redis持久化的原因,我们再详聊一下redis做持久化的第一种方式RDB,这种方式也是redis默认的一种持久化方式,默认是开启的。

​ 从字面上来看,RDB也就是redis database,翻译成中文就是redis 数据库,也就是说这种持久化方式就是像数据库一样存储了数据,当然事实上也是这样的,RDB方式是通过存储快照数据来完成的,既然是快照数据,那就是说明这种方式只关注了某一刻缓存的数据状态,那一刻数据是什么,并没有去记录这个数据变更的一系列过程。也就是说,RDB持久化方式关注的是数据存储的结果,而非是数据存储的过程。

​ 另外,既然是快照数据,redis又要保证性能,因此要明白RDB持久化时肯定不会是实时的,肯定是隔一段时间触发一次,否则的话redis作为一个单线程处理的服务,光顾着去持久化数据了,怎么还有时间处理来自客户端的请求访问,这也就说明了由于有时间间隔,redis的RDB方式的持久化会丢失最后一次持久化后的数据,这也就表明了redis的持久化没有办法保证数据的完整性。

2.1 触发快照的方式

  • 配置参数定期执行(在redis.conf中配置:save 多少秒内 数据变了多少)
save ""  # 不使用RDB存储  不能主从
save 900 1  # 表示15分钟(900秒钟)内至少1个键被更改则进行快照。
save 300 10 # 表示5分钟(300秒)内至少10个键被更改则进行快照。
save 60 10000 # 表示1分钟内至少10000个键被更改则进行快照。
  • 命令显式触发(save或者bgsave命令)

    127.0.0.1:6379> bgsave
    Background saving started

2.2 RDB执行流程

1.redis父进程首先判断,当前是否正在执行save,如果正在执行,则先返回。

2.父进程fork()复制出子进程,在这个过程中父进程是阻塞的,不再处理redis接收到的其他命令。当父进程fork结束,又可以重新处理工作。

3.子进程创建RDB文件,根据父进程的内存快照生成临时快照文件,完成后对原有的文件进行替换。始终保持RDB文件的完整性。

4.子进程生成RDB文件完成后,就响应信息给父进程,父进程更新统计信息。

2.3 RDB文件结构

1、头部5字节固定为“REDIS”字符串

2、4字节“RDB”版本号(不是Redis版本号),当前为9,填充后为0009

3、辅助字段,以key-value的形式

字段名 字段值 字段名 字段值
redis-ver 5.0.5 aof-preamble 是否开启aof
redis-bits 64/32 repl-stream-db 主从复制
ctime 当前时间戳 repl-id 主从复制
used-mem 使用内存 repl-offset 主从复制

4、存储数据库号码

5、字典大小6、过期key

7、主要数据,以key-value的形式存储

8、结束标志

9、校验和,就是看文件是否损坏,或者是否被修改。

2.4 RDB的优缺点

优点:

  • RDB是二进制压缩文件,占用空间小,便于传输。(做主从复制时传递给slaver效率也很高)
  • 通过主进程fork复制子进程,由子进程完成持久化的方式,这样可以最大化的保证redis的性能。但是前提条件是redis的数据量不能太大,否则fork的过程太长,容易造成阻塞。

缺点:

  • 不能保证数据的完成性,会丢失最后一次fork之后的数据。例如,redis进行持久化的操作是1分钟一次,当上次持久化完成后的30秒内,新添加了5000个数据,那么redis发生宕机然后重新恢复时,那30秒的数据会丢失。

浅谈:Redis持久化机制(一)RDB篇的更多相关文章

  1. Redis学习详解(一):Redis持久化机制之RDB

    Redis的持久化机制有两种:RDB持久化和AOF持久化.因为Redis是一个内存数据库,如果没有合适的持久化机制,那么一旦服务器进程退出,服务器中的数据库状态也会消失.本章介绍RDB持久化机制. R ...

  2. 北京大公司二面:了解Redis持久化机制吗?

    今日总结 Redis持久化机制:RDB和AOF RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制) AOF持久化:根据配置将写命令存储至日志文件中,顺序写&& ...

  3. 浅谈:Redis持久化机制(二)AOF篇

    浅谈:Redis持久化机制(二)AOF篇 ​ 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它 ...

  4. 浅谈Redis面试热点之工程架构篇[1]

    前言 前面用两篇文章大致介绍了Redis热点面试中的底层实现相关的问题,感兴趣的可以回顾一下:[决战西二旗]|Redis面试热点之底层实现篇[决战西二旗]|Redis面试热点之底层实现篇(续) 接下来 ...

  5. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  6. redis持久化的方式RDB 和 AOF

    redis持久化的方式RDB 和 AOF 一.对Redis持久化的探讨与理解 目前Redis持久化的方式有两种: RDB 和 AOF 首先,我们应该明确持久化的数据有什么用,答案是用于重启后的数据恢复 ...

  7. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  8. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  9. 听雷哥浅谈Redis

    Linux下安装redis 1.下载源码,解压缩后编译源码. $ wget http://download.redis.io/releases/redis-2.8.3.tar.gz $ tar xzf ...

随机推荐

  1. 利用Apache部署静态网站(二)

    本文接着<利用Apache部署静态网站(一)>继续部署,为系统中的每位用户创建一个独立的网站. httpd服务程序提供的个人用户主页功能可以为每位用户创建一个独立的网站.该功能可以让系统内 ...

  2. [VSC] HTML打叹号无法自动提示默认框架

    一般的, 在 VSC 中编辑 HTML 文档时, 打一个叹号 '!', 就会提示, 可生成默认代码, 如: 采纳建议后, 是这样: 问题: 如果出现打叹号无法出现提示的情况, 首先, 请检查当前的语言 ...

  3. 03- Linux目录与文件进阶操作

    第三课 目录与文件进阶操作cat (一次性全部输出文件内容)   cat -n 文件名 显示行号   cat -b 文件名 空行不显示行号less (分页显示,可以上下翻页,光标键上下键,PageUp ...

  4. vue2整个项目中,数据请求显示loading图----------未完成阅读,码

    一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...

  5. 【网络协议】 TCP三次握手的流程

    在TCP/IP协议中,TCP协议通过三次握手,建立可靠的连接服务: 三次握手是由客户端发起 第一步: 客户端向服务端发送请求报文(实际上就是一个具有特定格式的数据包),报文中包含一个标志为Syn,Sy ...

  6. Metasploit Framework(MSF)的使用

    目录 Metasploit 安装Metasploit 漏洞利用(exploit) 攻击载荷(payload) Meterpreter MS17_010(永恒之蓝) 辅助模块(探测模块) 漏洞利用模块 ...

  7. Python爬虫 XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  8. HarmonyOS三方件开发指南(19)-BGABadgeView徽章组件

    目录: 1.引言 2.功能介绍 3.BGABadgeView 使用指南 4.BGABadgeView 开发指南 5.<HarmonyOS三方件开发指南>系列文章合集 引言 现在很多的APP ...

  9. (邹博ML)矩阵和线性代数

    主要内容 矩阵 特征值和特征向量 矩阵求导 矩阵 SVD的提法 奇异值分解(Singular Value Decomposition)是一种重要的矩阵分解方法,可以看做对称方阵在任意矩阵上的推广. 假 ...

  10. Day006 命令行传参

    命令行传参 有时候你希望运行一个程序时候再传递给它消息,这要靠传递命令行参数给main()函数实现. 使用方法 写测试代码. public static void main(String[] args ...