我们都知道redis非关系型数据库的数据都是保存在内存中的,虽然运行速度很快,但是容易出现问题,就是但我们电脑关机的时候,内存中的数据会清空;虽然我们服务器不容易关机,但是当发生断电等灾难情况的时候,就会出现数据丢失,所以,我们为了数据的安全,会将数据进行持久化,从内存中保存到硬盘。
利用永久性储存介质,将数据进行保存,在特定的时间,将保存的数据进行恢复的工作机制称为持久化。
持久化用于防止数据的意外丢失,确保数据安全性。
RDB(数据持久化)
将当前数据状态进行保存,以快照的形式存储数据结果,存储格式简单,关注点在于数据。
AOF(过程持久化)
将数据的操作过程以日志的形式进行保存,存储操作过程,存储格式复杂,关注点在数据的操作过程。
指令格式
手动指定一次保存操作
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过程完成为止,有可能会造成长时间阻塞。
还是在redis.conf配置文件中进行配置。
指令格式
手动启动后台保存操作,但不是立即执行
bgsave
bgsave指令相关配置
后台存储过程中如果出现错误现象,是否停止保存操作,默认yes
stop-writes-on-bgsave-error yes|no
其他更save配置一样
dbfilename filename dir path rdbcompression yes|no rdbchecksum yes|nobgsave指令工作原理
当redis接收到bgsave指令的时候,会单独开一个线程执行数据的持久化操作,不会阻塞redis的执行,但是会分摊一些性能,Redis内部所有涉及到RDB操作都采用bgsave的方式。
设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化
save second changes
参数说明
second:监控之间范围,单位秒
changes:监控key的变化数量。
示例
save 300 10
表示在300秒内,如果key的变化数量达到了10次,就进行数据自动持久化。
key的变化数量指的是key的增删改操作,查询操作不会改变key,所以不计数。
注意
save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的。
save配置启动后执行的是bgsave操作
AOF会记录用户操作Redis的指令,放入刷新缓存区,当缓存区的指令到达一定数量的时候,将指令同步到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,文件会越来越大,为了解决这个问题,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个元素
手动重写
bgrewriteaof
AOF自动重写方式
# 代表当前AOF文件空间和上次重写后AOF空间的比值。 auto-aof-rewrite-percentage percentage # AOP超过多少兆后就开始自动重写 auto-aof-rewrite-min-size sizeAOF重写流程
持久化方式RDBAOF占用存储空间小(数据级:压缩)大(指令级:重写)存储速度慢快恢复速度快慢数据安全性会丢失数据根据策略决定资源消耗高/重量级低/轻量级启动优先级低高