redis高级
持久化
RDB持久化机制
概念:
RDB其实就是把数据以快照的形式保存在磁盘上。RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
触发方式
(1)save
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。
(2)bgsave
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
(3)自动触发
自动触发是由我们的配置文件来完成的。在redis.conf配置文件中,里面有如下配置,我们可以去设置:
**①save:**这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘。比如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。
默认如下配置:
#表示900 秒内如果至少有 1 个 key 的值变化,则保存save 900 1#表示300 秒内如果至少有 10 个 key 的值变化,则保存save 300 10#表示60 秒内如果至少有 10000 个 key 的值变化,则保存save 60 10000
不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能。
**②stop-writes-on-bgsave-error :**默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了
**③rdbcompression ;**默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。
**④rdbchecksum :**默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
**⑤dbfilename :**设置快照的文件名,默认是 dump.rdb
**⑥dir:**设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。
触发方式的对比
RDB 的优势和劣势
①、优势
(1)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
(2)生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
(3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
②、劣势
(1)存储数据量较大,效率较低
基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低
(2)大数据量下的IO性能较低
(3)基于fork创建子进程,内存产生额外消耗
(4)宕机带来的数据丢失风险
AOF持久化机制
概念
(1)以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生的过程
(2)AOF的主要作用是解决了数据持久化的实时性,目前已经是redis持久化的主流方式
AOF写数据三种策略
(1)always(每次)
每次写入操作均同步到AOF文件中,数据零误差,性能较低
(2)everysec(每秒)
每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高
(3)no(系统控制)
由操作系统控制每次同步到AOF文件的周期,整体过程是不可控的
AOF重写
随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是将redis进程内的数据转化为同步到AOF文件的过程。简单的说就是将对同一个数据的若干条命令执行结果转化成最终结果数据对应的指令进行记录
作用
(1)降低磁盘占用量,提高磁盘利用率
(2)提高持久化操作,降低持久化时间,提高IO性能
(3)降低数据恢复用时,提高数据恢复效率
规则
(1)进程内已超时的数据不再写入文件
(2)忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据写入命令,如del key1、hedl key2、srem key3 、set key4 111、set key 222等
(3)对同一数据的多条写命令合并为一条命令
如:lpush list1 a 、lpush list1 b、lpush list1 c 可以转化为:lpush list1 a b c
为防止数据量过大造成客户端缓冲区溢出,对list、 set 、 hash 、zset
等类型,每条指令最多写入64个元素
重写方式
(1)手动重写
bgrewriteaof(后台重写)
(2)自动重写
RDB与AOF的区别