Redis持久化配置与操作

    技术2024-10-26  17

    我们都知道redis非关系型数据库的数据都是保存在内存中的,虽然运行速度很快,但是容易出现问题,就是但我们电脑关机的时候,内存中的数据会清空;虽然我们服务器不容易关机,但是当发生断电等灾难情况的时候,就会出现数据丢失,所以,我们为了数据的安全,会将数据进行持久化,从内存中保存到硬盘。

    什么是持久化?

    ​ 利用永久性储存介质,将数据进行保存,在特定的时间,将保存的数据进行恢复的工作机制称为持久化。

    ​ 持久化用于防止数据的意外丢失,确保数据安全性。

    持久化的两种方式

    RDB(数据持久化)

    将当前数据状态进行保存,以快照的形式存储数据结果,存储格式简单,关注点在于数据。

    AOF(过程持久化)

    将数据的操作过程以日志的形式进行保存,存储操作过程,存储格式复杂,关注点在数据的操作过程。

    RDB

    save指令

    指令格式

    手动指定一次保存操作

    save

    save指令的相关配置

    在redis安装目录中的redis.conf配置文件中设置

    设置本地数据库文件名,默认值为 dump.rdb,通常设置为dump-端口号.rdb

    dbfilename filename

    设置存储.rdb文件的路径,通常设置成存储空间较大的目录中,目录名称data

    dir path

    设置存储至本地数据库时是否压缩数据,默认yes,设置为no,节省 CPU 运行时间,但存储文件变大

    rdbcompression yes|no

    设置读写文件过程是否进行RDB格式校验,默认yes,设置为no,节约读写10%时间消耗,但存在数据损坏的风险

    rdbchecksum yes|no

    save指令工作原理

    save指令会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞。

    bgsave指令

    ​ 还是在redis.conf配置文件中进行配置。

    指令格式

    手动启动后台保存操作,但不是立即执行

    bgsave

    bgsave指令相关配置

    后台存储过程中如果出现错误现象,是否停止保存操作,默认yes

    stop-writes-on-bgsave-error yes|no

    其他更save配置一样

    dbfilename filename dir path rdbcompression yes|no rdbchecksum yes|no

    bgsave指令工作原理

    当redis接收到bgsave指令的时候,会单独开一个线程执行数据的持久化操作,不会阻塞redis的执行,但是会分摊一些性能,Redis内部所有涉及到RDB操作都采用bgsave的方式。

    设置save自动持久化

    设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化

    save second changes

    参数说明

    second:监控之间范围,单位秒

    changes:监控key的变化数量。

    示例

    save 300 10

    表示在300秒内,如果key的变化数量达到了10次,就进行数据自动持久化。

    key的变化数量指的是key的增删改操作,查询操作不会改变key,所以不计数。

    注意

    save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的。

    save配置启动后执行的是bgsave操作

    RDB两种启动方式的对比

    方式save指令bgsave指令读写同步异步阻塞1客户端指定是否额外内存消耗否是启动新线程否是

    RDB的优缺点

    优点 RDB是一个紧凑压缩的二进制文件,存储效率较高DB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景RDB恢复数据的速度要比AOF快很多应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复 缺点 RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据,在上一次持久化与下一次持久化的时间内容易出现数据的丢失。bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

    AOF

    AOF的概念

    以日志的方式记录每次执行的命令,重启时再重新执行AOF文件中的命令,达到恢复数据的目的。AOF解决了RDB不能实时持久化数据的问题,目前已经是Redis持久化的主流方式。

    AOF执行原理

    AOF会记录用户操作Redis的指令,放入刷新缓存区,当缓存区的指令到达一定数量的时候,将指令同步到AOF文件中,达到持久化的目的。

    启动AOF相关配置

    ​ 以下配置在redis.conf配置文件中进行配置。

    开启AOF持久化功能,默认no,即不开启状态

    appendonly yes|no

    AOF持久化文件名,默认文件名为appendonly.aof,建议配置为appendonly-端口号.aof

    appendfilename filename

    AOF持久化文件保存路径,与RDB持久化文件保持一致即可

    dir filePath

    AOF写数据策略,默认为everysec

    appendfsync always|everysec|no

    always(每次)

    每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用。

    everysec(每秒):每秒将缓冲区中的指令同步到AOF文件中,在系统突然宕机的情况下丢失1秒内的数据 数据准确性较高,性能较高,建议使用,也是默认配置

    no(系统控制):由操作系统控制每次同步到AOF文件的方式,整体过程不可控,不推荐使用。

    AOF重写

    概念

    随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。

    AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。

    简单说就是将对同一个数据的若干条命令执行结果,转化成最终结果数据对应的指令进行记录。

    AOF重写的作用

    降低磁盘占用量,提高磁盘利用率提高持久化效率,降低持久化写时间,提高IO性能降低数据恢复用时,提高数据恢复效率

    AOF重写规则

    进程内具有时效性的数据,、已超时的数据将不再写入文件。

    非写入类的无效指令将被忽略,只保留最终数据的写入命令;如获取查看数据的指令将会被忽略。

    对同一数据的多条写命令合并为一条命令

    如lpush list1 a、lpush list1 b、 lpush list1 c 可以转化为:lpush list1 a b c。

    为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素

    AOF重写方式

    手动重写

    bgrewriteaof

    AOF自动重写方式

    # 代表当前AOF文件空间和上次重写后AOF空间的比值。 auto-aof-rewrite-percentage percentage # AOP超过多少兆后就开始自动重写 auto-aof-rewrite-min-size size

    AOF重写流程

    RDB与AOF的区别

    持久化方式RDBAOF占用存储空间小(数据级:压缩)大(指令级:重写)存储速度慢快恢复速度快慢数据安全性会丢失数据根据策略决定资源消耗高/重量级低/轻量级启动优先级低高

    RDB与AOF的选择使用

    对数据非常敏感,建议使用默认的AOF持久化方案.数据呈现阶段有效性,建议使用RDB持久化方案
    Processed: 0.011, SQL: 9