持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘

redis提供了两种持久化方式

  • RDB(系统默认)
  • AOF

RDB方式

rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在redis根目录的dump.rdb文件中。

RDB触发的三种方式

  • save
  • bgsave
  • 条件自动触发

save方式

当执行save命令 redis会变成阻塞状态、所有命令都要排队(也就是同步)

优点:不会消耗额外的内存。

缺点:阻塞客户端命令。

实验:在redis安装目录下新建一个config 目录,复制一个文件命令redis-6379.conf

redis-server redis-6379.conf

开启两个终端窗口、并redis-cli
图
执行save 另一个窗口执行 操作命令
图
阻塞了6.43时间

bgsave方式

当执行bgsave命令、redis会fork个子进程,并不影响redis正常操作(异步)

优点:不阻塞客户端命令

缺点:需要fork。消耗内存

实验:

127.0.0.1:6379> bgsave

获取数据不会阻塞、另一端执行bgsave

ps -ef |grep redis- |grep -v "redis-cli" |grep -v "grep"

图

多个bgsave进程

条件自动触发

save 900 1:表示900秒内至少一个键被更改则进行快照。
save 300 10
save 60 10000

本质上属于bgsave、是带条件的。

缺点:如果对于写量非常大的网站、消耗过大。还不太好控制。

redis.conf的部分配置

dbfilename dump.rdb 名称
dir  ./
stop-writes-on-bgsave-error  yes bgsave发生错误是否停止写入
rdbcompression  yes   rdb持久化文件是否采用压缩格式
rdbchecksum yes     是否对rdb文件进行校验

最佳配置

#save 900 1
#save 300 10    #把条件注释掉
#save 60 10000  
dbfilename dump-{$port}.rdb  
#redis单线程 一台服务器可以有多个redis启动、充分利用多核心cpu。指定端口名称方式覆盖。
dir /path   #指定分区或分盘位置
stop-writes-on-bgsave-error  yes 
rdbcompression  yes   
rdbchecksum yes

触发机制-不容忽略的方式

全量复制没有配置策略或者save等命令、也会自动生成rdb文件。在主从复制的场景上触发了
debugreload
shutdown

RDB整体缺点:耗时、耗性能。消耗内存、数据不可控。容易丢失数据(在为满足条件时、出现宕机等时间点上。这部分数据丢失)

文件修复:redis-check-dump

AOF方式

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录

AOF方式的三种配置

  • always
  • everysec
  • no

always

每条命令都同步到硬盘中

优点:不丢失数据

缺点:IO开销较大

everysec

每秒(默认值)一次刷新到硬盘当中

优点:每秒一次刷新

缺点:丢失一秒的数据

no

系统决定刷新到硬盘当中

优点:不用管

缺点:不可控

AOF文件的问题

AOF随着命令的写入、增大,随着文件的增大,内存恢复的时间也增大。

AOF提供了重写功能

假如:set hello  word
     set hello  hehe
     set hello  java 
那么:AOF重写的记录是这样
    set hello  java

AOF重写的作用:减少硬盘的占用量,加快内存的回复速度

AOF重写的两种方式:

bgrewriteaof

利用了fork后的子进程、类似bgsave。

是有客户端给redis发送 bgrewriteaof命令、 服务器端fork子进程执行命令对内存中的数据进行重写

AOF重写配置

auto-aof-rewrite-min-size
aof文件重写需要的尺寸
auto-aof-rewrite-percentage
aof文件增长率 ,当文件重写后、下次增长达到增长率才会重写

统计

aof_current_size AOF当前尺寸(单位:字节)
aof_base_size  AOF上次启动和重写的尺寸(单位:字节)

自动触发的条件

aof_current_size>auto-aof-rewrite-min-size
同时满足
aof_current_size - aof_base_size/aof_base_size>auto-aof-rewrite-percentage

redis-check-aof(修复工具)

配置

appendonly yes  默认为no  yes是开启
appendfilename "appendonly-${port}.aof"
appendsync  everysec 三种触发策略之一
dir /bigdiskpath  保存目录
no-appendfsync-on-rewrite  yes  重写的时候不做append aof操作  选yes是最佳性能
auto-aof-rewrite-percentage  100  增长率
auto-aof-rewrite-min-size 64mb  最小重写文件大小

动态开启aof

配置图

vs|RDB | AOF

  • 命令RDBAOF
    启动优先级
    体积
    恢复速度
    数据安全性丢数据根据策略决定
    消耗

最佳策略

RDB最佳策略

关掉RDB条件、如果是以天或小时来做方便集中管理,主从、从开

AOF最佳策略

开启、建议everysec。如果不是重要数据只简单做缓存、可以关闭AOF

Last modification:February 10, 2020
如果觉得我的文章对你有用,请随意赞赏