视频资源:
链接:https://pan.baidu.com/s/1VwGnpdP_JxYNWrPTPvMolg 提取码:810c
4 Redis持久化
Redis是一个内存数据库,所以其运行效率非常高。但也存在一个问题:内存中的数据是不持久的,若主机宕机或Redis关机重启,则内存中的数据全部丢失。当然,这是不允许的。Redis具有持久化功能,其会按照设置以快照或操作日志的形式将数据持久化到磁盘。
根据持久化使用技术的不同,Redis的持久化分为两种:RDB与AOF。
4.1 持久化基本原理
Redis持久化也称为钝化,是指将内存中数据库的状态描述信息保存到磁盘中。只不过是不同的持久化技术,对数据的状态描述信息是不同的,生成的持久化文件也是不同的。但它们的作用都是相同的:避免数据意外丢失。
通过手动方式,或自动定时方式,或自动条件触发方式,将内存中数据库的状态描述信息写入到指定的持久化文件中。当系统重新启动时,自动加载持久化文件,并根据文件中数据库状态描述信息将数据恢复到内存中,这个数据恢复过程也称为激活。这个钝化与激活的过程就是Redis持久化的基本原理。
不过从以上分析可知,对于Redis单机状态下,无论是手动方式,还是定时方式或条件触发方式,都存在数据丢失问题:在尚未手动/自动保存时发生了Redis宕机状况,那么从上次保存到宕机期间产生的数据就会丢失。不同的持久化方式,其数据的丢失率也是不同的。
需要注意的是,RDB是默认持久化方式,但Redis允许RDB与AOF两种持久化技术同时开启,此时系统会使用AOF方式做持久化,即AOF持久化技术的优先级要更高。同样的道理,两种技术同时开启状态下,系统启动时若两种持久化文件同时存在,则优先加载AOF持久化文件。
4.2 RDB持久化
RDB,Redis DataBase,是指将内存中某一时刻的数据快照全量写入到指定的rdb文件的持久化技术。RDB持久化默认是开启的。当Redis启动时会自动读取RDB快照文件,将数据从硬盘载入到内存,以恢复Redis关机前的数据库状态。
4.2.1 持久化的执行
RDB持久化的执行有三种方式:手动save命令、手动bgsave命令,与自动条件触发。
4.2.1.1 手动save命令
通过在redis-cli客户端中执行save命令可立即进行一次持久化保存。save命令在执行期间会阻塞redis-server进程,直至持久化过程完毕。而在redis-server进程阻塞期间,Redis不能处理任何读写请求,无法对外提供服务。
4.2.1.2 手动bgsave命令
通过在redis-cli客户端中执行bgsave命令可立即进行一次持久化保存。不同于save命令的是,正如该命令的名称一样,background save,后台运行save。bgsave命令会使服务器进程redis-server生成一个子进程,由该子进程负责完成保存过程。在子进程进行保存过程中,不会阻塞redis-server进程对客户端读写请求的处理。
4.2.1.3 自动条件触发
自动条件触发的本质仍是bgsave命令的执行。只不过是用户通过在配置文件中做相应的设置后,Redis会根据设置信息自动调用bgsave命令执行。具体配置方式,后面会详解。
4.2.1.4 查看持久化时间
通过lastsave命令可以查看最近一次执行持久化的时间,其返回的是一个Unix时间戳。
4.2.2 RDB优化配置
RDB相关的配置在redis.conf文件的SNAPSHOTTING部分。
4.2.2.1 save
该配置用于设置快照的自动保存触发条件,即save point,保存点。该触发条件是在指定时间段内发生了指定次数的写操作。除非另有规定,默认情况下持久化条件为save 3600 1 300 100 60 10000。其等价于以下三条:
- save 3600 1 # 在3600秒(1小时)内发生1次写操作
- save 300 100 # 在300秒(5分钟)内发生100次写操作
- save 60 10000 # 在60秒(1分钟)内发生1万次写操作
如果不启用RDB持久化,只需设置save的参数为空串即可:save “”。