持久化(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文件。在主从复制的场景上触发了 |
---|---|
debug | reload |
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
命令 RDB AOF 启动优先级 低 高 体积 小 大 恢复速度 快 慢 数据安全性 丢数据 根据策略决定 消耗 高 低
最佳策略
RDB最佳策略
关掉RDB条件、如果是以天或小时来做方便集中管理,主从、从开
AOF最佳策略
开启、建议everysec。如果不是重要数据只简单做缓存、可以关闭AOF