Redis中RDB持久化

什么是RDB持久化

Redis是内存数据库。所谓内存数据库,就是将数据放在内存中直接操作的数据。它和磁盘数据库是互补的,各有优缺点。最主要的是:相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。但是它也有缺陷,最主要的就是它是将数据库状态存储在内存中的,占用的是内存资源,一旦服务器进程退出,服务器中的数据就会消失不见。所以Redis持久化是十分必要的。

Redis数据存储模式:一种是cache-only, 只做缓存服务,不持久化数据,数据在服务终止后消失。另一种是persistence, 将内存中的数据备份到磁盘文件中,在服务重启后可恢复。

我们说的RDB持久化就是一种persistence存储。可以将Redis在内存中的数据库状态保存到磁盘里面,以免数据意外丢失。RDB文件是一个二进制文件dump.rdb,保存在硬盘中,服务器重启时会自动执行载入RDB文件。

生成RDB文件

  • SAVE命令:阻塞服务器进程,直到服务器创建好RDB文件为止,期间不能处理任何命令请求。
  • BGSAVE命令:服务器进程会fork()一个子进程,这个子进程来负责创建RDB文件,所以服务器进程(父进程)可以继续处理命令请求。但是不能执行SAVE命令,BGSAVE命令,BGREWRITEAOF命令。因为这些命令会导致竞争或者极大降低服务器性能。试想多个子进程都在独立执行数据库数据的访问,磁盘的存储,当数据库很大的时候是一件十分可怕的事情。
  • 自动间隔性存储:Redis还可以允许用户设置服务器配置的SAVE选项来让服务器每隔一段时间自动执行一次BGSAVE命令。比如像服务器提供如下配置:

            ```
            save 900 1
            save 300 10
            ```
    

    第一个表示服务器在900秒以内,对数据库进行了至少一次的修改就执行BGSAVE。
    第二个表示服务器在300秒以内,对数据库进行了至少10次的修改就执行BGSAVE。

RDB文件结构

这里写图片描述
RDB文件保存的是二进制数据,和以太网帧或者TCP报文有点像。
第一层:
REDIS: 5个字节, 保存”REDIS”这5个字符,作为载入时快速检查是否为RDB文件,和前同步码有点类似。
da-version: 4字节, 保存版本号。
database0: 0号数据库,存在即表明非空,空的数据库长度为0字节,不保存。
database3: 3号数据库
EOF: 1字节,标志RDB正文的结束。
check_sum: 8字节,校验和,对REDIS, db_ersion, databases, EOF四个部分内容计算得出的,载入时检测RDB文件是否出错。

第二层:
是对第一层中database0的“放大”版本。
SELECTDB: 1字节,当读入程序遇到这个值时,它知道接下来读入的是一个数据库号码。
db_number: 保存着一个数据库号码,当程序读入db_number时,服务器会调用SELECT命令,根据读入的数据库号码切换数据库,使得之后读入的键值对数据能够载入到正确的数据库中。
key_value_pairs: 保存了数据库中的键值对数据,带有过期时间的键值对和不带有过期时间的键值对是不同的,具体的看第三层。

第三层:
左边的是不带过期时间的键值对
TYPE:记录了键值对中值value的类型,长度为1字节。(因为值得类型都是字符串对象)当服务器读入RDB时,会根据这个TYPE字段来决定如何读入和解释value字段。
key:字符串对象,根据key的内容不同,其长度也会不同。
value: 不同的TYPE类型对应不同的value编码方式。主要有字符串对象,列表对象,集合对象,哈希表对象,有序集合对象等。

右边是带过期时间的键值对
EXPIRETIME_MS: 1字节,是一个常量,告诉读入程序,接下来要读入的是一个一毫秒为单位的过期时间。
ms: 8字节, 以毫秒为单位的过期时间,是一个UNIX时间戳,代表着从格林乔治时间开始到现在的毫秒数。
key和value与左边的相同。

发布了30 篇原创文章 · 获赞 23 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章