Redis 持久化、key过期策略、淘汰策略

Redis 数据存在内存中,内存读取快但内存只是负责暂时性的存储,这理整理下Redis的持久化方案。

RDB : 在指定的时间间隔内将内存中的数据集快照写入磁盘。

  • 快照数据存储在,默认 dump.rdb 文件中

触发方式:

  • 手动触发:输入命令 save,该命令会阻塞当前Redis服务器,执行save命令期间,执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。
  • 手动触发:输入命令 bgsave ,redis系统调用函数fork(),创建一个子进程将数据集写入到一个临时 RDB 文件中,完成后替换并删除旧RDB文件,操作是异步的阻塞只发生在fork阶段,一般时间很短。
  • 自动触发:修改配置文件,1,多少秒内有多少个key被更改时触发。

特点:

  • 全量备份,在大数据集恢复时,数据较快。
  • 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格式的增量数据

  • version >4.0

  • 开启:配置文件中,aof-use-rdb-preamble yes

  • 触发:bgrewriteaof

  • 过程: 当开启混合持久化时,fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件,
    然后在将aof_rewrite_buf重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息,并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件

  • 恢复: 在redis重启的时候,加载 aof 文件进行恢复数据:先加载 rdb 内容再加载剩余的 aof。
    Redis 持久化、key过期策略、淘汰策略_第1张图片


key淘汰策略

  • 当数据集过大时,超过reids设置的最大内存,会删除掉部分key
  • 如何保持redis存储的都是有效的热点数据

内存上限设置:maxmemory
在这里插入图片描述

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:

  • 所有缓存通过一个链表连接起来,新创建的缓存添加到链表的头部,如果有缓存被访问了,就把缓存移动到链表的头部。
    由于被访问的缓存会移动到链表的头部,所以没有被访问的缓存会随着时间的推移移动的链表的尾部,
    淘汰数据时只需要从链表的尾部开始。

你可能感兴趣的:(缓存,笔记,redis,缓存,数据库)