数据结构论坛

首页 » 分类 » 常识 » Redis持久化锦囊在手,再也不会担心数
TUhjnbcbe - 2021/8/19 17:54:00
北京最好的白癜风医院电话 http://baidianfeng.39.net/

大家好,我是小羽。

Redis的读写都是在内存中进行的,所以它的性能高。而当我们的服务器断开或者重启的时候,数据就会消失,那么我们该怎么解决这个问题呢?

其实Redis已经为我们提供了一种持久化的机制,分别是RDB和AOF两种方式,接下来跟着我一起看看这两个锦囊都是怎么保证数据的持久化的。

持久化

由于Redis是基于内存的数据库,所以当服务器出现故障的时候,我们的数据就得不到安全保障。

这个时候就需要将内存中的数据存储到磁盘中,当我们服务器重启时,便可以通过磁盘来恢复数据,这个过程就叫做Redis持久化。

Redis持久化RDB简介

RDB全称RedisDatabaseBackupfile(Redis数据备份文件),也可以称为Redis数据快照。

RDB文件是一个经过压缩的二进制文件(默认:dump.rdb);

RDB文件保存在硬盘里;

通过保存数据库中的键值对来记录数据库状态。

创建

当Redis持久化时,程序会将当前内存中的数据库状态保存到磁盘中。

创建

创建RDB文件主要有两个Redis命令:SAVE和BGSAVE。

SAVE

同步操作,执行命令时,会阻塞Redis服务器进程,拒绝客户端发送的命令请求。

代码示例:

defSAVE():#创建RDB文件rdbSave()

图示:

Save命令BGSAVE

异步操作,执行命令时,子进程执行保存工作,服务器还可以继续让主线程处理客户端发送的命令请求。

代码示例:

defBGSAVE():#创建子进程pid=fork()ifpid==0:#子进程负责创建RDB文件rdbSave()#完成之后向父进程发送信号signal_parent()elifpid0:#父进程继续处理命令请求,并通过轮训等待子进程的信号handle_request_and_wait_signal()else:handle_fork_error()

图示:

bgSave命令载入

载入工作在服务器启动时自动执行。

载入

服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止。

主要设置

Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。

设置保存条件

提供配置如下:

savesave

在这种情况下,只要满足以下条件中的一个,BGSAVE命令就会被执行:

服务器在秒之内,对数据库进行了至少1次修改了;

服务器在秒之内,对数据库进行了至少10次修改。

saveparams

服务器程序会根据save选项所设置的保存条件,设置服务器状态redisServer结构的saveparams属性。

saveparams属性是一个数组;

数组中的每一个元素都是一个saveparam结构;

每个saveparam结构都保存了一个save选项设置的保存条件。

structsaveparam{//秒数time_tseconds;//修改数intchanges;}dirty

dirty计数器记录距离上一次成功执行SAVE命令或BGSAVE命令之后,服务器对数据库状态进行了多少次修改(包括写入、删除、更新等操作)。

lastsave

是一个UNINX时间戳,记录了服务器上一次成功执行SAVE命令或者BGSAVE命令的时间。

检查保存条件是否满足

服务器周期性操作函数serverCron(该函数对正在运行的服务器进行维护)默认每隔毫秒就会执行一次,其中一项工作就是检查save选项所设置的保存条件是否已经满足,满足的话就执行BGSAVE命令。

代码示例:

defserverCron():#....#遍历所有保存条件forsaveparaminserver.saveparams:#计算距离上次执行保存操作有多少秒save_interval=unixtime_now()-server.lastsave#如果数据库状态的修改次数超过条件所设置的次数#如果距离上次保存的时间超过条件所设置的时间ifserver.dirty=saveparam.changesandsave_intervalsaveparam.seconds:BGSAVE()默认配置

RDB文件默认的配置如下:

################################SNAPSHOTTING##################################SavetheDBondisk:#在给定的秒数和给定的对数据库的写操作数下,自动持久化操作。#savesecondschanges#savesavesave6000#bgsave发生错误时是否停止写入,一般为yesstop-writes-on-bgsave-erroryes#持久化时是否使用LZF压缩字符串对象?rdb

1
查看完整版本: Redis持久化锦囊在手,再也不会担心数