Redis 数据存在内存中,内存读取快但内存只是负责暂时性的存储,这理整理下Redis的持久化方案。
RDB
: 在指定的时间间隔内将内存中的数据集快照写入磁盘。
- 快照数据存储在,默认
dump.rdb
文件中
触发方式:
特点:
- 全量备份,在大数据集恢复时,数据较快。
- bgsave子进程生成RDB文件是,父进程数据的修改无法感知,可能造成数据丢失
AOF
:以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件.
- 开启:配置文件中
appendonly no
触发配置:
appendfsync always
:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全appendfsync everysec
:每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。appendfsync no
:从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择
aof文件重写:
- 目的:数据量过大时,aof文件体积也会越来越大,为了缓解磁盘空间压力.
- 压缩:重写的aof文件记录的只是每个数据的最后一次写指令,也就是最新的数据,不会记录之前冗余的操作,所以这样会很大程度的缩小AOF的体量
- 手动触发:
bgrewriteaof
- 配置触发
# 指当前aof文件比上次重写的增长比例大小,达到这个大小就进行 aof 重写
auto-aof-rewrite-percentage 100
# 最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了
auto-aof-rewrite-min-size 64mb
混合持久化:新的AOF文件前半段是RDB格式的全量数据,后半段是AOF格式的增量数据
key淘汰策略
- 当数据集过大时,超过reids设置的最大内存,会删除掉部分key
- 如何保持redis存储的都是有效的热点数据
key过期策略:
- 定期删除
指的是redis默认是每隔100ms随机抽取一些key来检查和删除的。定期删除可能会导致很多过期key到了时间并没有被删>除掉,这时候就需要惰性删除了。- 惰性删除
在获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不>会给你返回任何东西。- 两种
结合使用
,就能够保证:一个key如果过期了,肯定会被删除了
key淘汰策略:
- 触发:内存达到上限时
策略 | 效果 |
---|---|
noeviction -默认 | 当内存使用达到阀值的时候,所有引起申请内存的命令会报错 |
allkeys-lru | 尝试回收,最近未使用或者使用比较少的键。(范围是:所有的键) |
volatile-lru | 尝试回收,最近未使用或者使用比较少的键。(范围是:设置了过期时间的键) |
allkeys-random | 随机移除某个key。(范围是:所有的键) |
volatile-random | 随机移除某个key。(范围是:设置了过期时间的键) |
volatile-ttl | 回收过期时间较短的key。(范围是:设置了过期时间的键) |
LRU:
- 所有缓存通过一个链表连接起来,新创建的缓存添加到链表的头部,如果有缓存被访问了,就把缓存移动到链表的头部。
由于被访问的缓存会移动到链表的头部,所以没有被访问的缓存会随着时间的推移移动的链表的尾部,
淘汰数据时只需要从链表的尾部开始。