redis持久化
Posted wsfu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis持久化相关的知识,希望对你有一定的参考价值。
redis持久化分为RDB和AOF两种方式,根据个人的理解,即一次全量的持久化和多次增量的持久化。
1、RDB方式
RDB持久化是通过快照完成的。当符合一定条件时Redis会将内存中的所有数据生成一个副本存储在硬盘上,这个过程即为“快照”。Redis通常会在以下几种情况下会对数据进行快照:
1)根据配置进行快照
上图中的save 900 1/save 300 10/save 60 10000即是Redis的默认配置,含义是在900秒内有一个或一个以上的键值被更改则进行快照;300秒与60秒的配置类似。
2)用户执行save或bgsave命令
当执行save命令时,redis会同步进行快照操作,在执行的过程中会阻塞所有来自客户端的请求,如果数据了过大,则执行该命令后redis将会在一段时间内无响应,故不建议在生产环境执行该命令;bgsave命令与save命令不同,它在执行快照的过程中仍可以处理客户端的请求,当想知道快照是否完成,可以通过lastsave命令查询最近一次完成快照的时间。
3)执行flushall命令
当执行flushall命令时,Redis会清除数据库中的所以数据,不论是否触发了自动快照的条件。当没有定义快照条件时,执行该命令不会进行快照。
4)执行复制时
这里说的复制一般指主从数据库同步数据的过程中生成的快照,即master数据库生成快照传输给slave数据库。根据《Redis入门指南》,还有一种特殊情况,需要说明。当linux系统执行fork函数时,会采用写时复制策略,父子进程会共享同一内存数据,当父进程需要做写操作时,才会复制一份数据以保证子进程不受影响,因此,执行fork操作不会导致redis内存消耗翻倍,故需要确保linux允许应用程序申请超过可用内存(物理内存与交换分区)的空间,方法是在/etc/sysctl.conf文件中加入vm.overcommit_memory=1,然后重启系统或者执行systcl vm.overcommit_memory=1确保设置生效。
另外,RDB是经过压缩的二进制格式,占用空间较小,在CPU占用严重时,可以修改配置中的rdbcompression参数以禁用压缩功能。
2、AOF
redis默认不开启AOF方式的持久化,可以修改配置appendonly yes开启。AOF文件保存位置是通过配置dir参数设置的,默认文件名是appendonly.aof,可以通过修改appendfilename参数修改。因为aof会写入每一个命令操作,这会导致aof文件越来越大,当达到一定条件后,aof文件会进行重写(如删除被覆盖的操作记录),该配置可以在配置文件中配置:
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 100参数的含义是:当当前aof文件超过上一次重写时的aof文件大小的100%时会重写;若之前没有冲写过,则以启动时的aof文件的大小为依据。
auto-aof-rewrite-min-size 64mb参数限制了允许重写的最小aof文件大小。
虽然每次更改数据库内容时,aof都会将命令写入硬盘,但实际上只是写入硬盘缓存中,默认每30s执行一次同步操作,若这期间linux系统故障则会导致硬盘缓存中的数据丢失,在Redis中可以通过设置参数来调整同步时机:
#appendsync always
appendsync everysec
#appendsync no
如果redis同时开启了RDB与AOF持久化,则Redis重启后默认以AOF恢复数据,因为AOF数据相比RDB可能会更完整些。
以上是关于redis持久化的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段