Redis篇:持久化、淘汰策略,缓存失效策略

关注公众号,一起交流,微信搜一搜: 潜行前行

redis 持久化

redis 的数据是保存再系统内存里面的。持久化就是把内存的数据转移到磁盘中,redis 的持久化策略有两种:RDB、AOF

RDB

  • RDB 是以快照的形式把内存里的数据生成一个 RDB 格式备份文件,定时保存。保存的是数据的压缩过数据结构
  • 有两个命令 SAVE、BGSAVE 可以生成 RDB 文件,SAVE 会阻塞主服务进程,直到 RDB 文件创建完毕。BGSAVE 则是派生一个子进程去执行 RDB 的生成
  • RDB 会在 redis 启动时被加载,没有特殊加载命令

RDB 的原理总结

  • 当 redis 需要做持久化时,redis 会 fork一个子进程,子进程将数据写到磁盘上一个临时 RDB 文件中。当子进程完成写临时文件后,将原来的 RDB 文件替换掉,这样的好处是可以copy-on-write

RDB 优缺点

  • 适合冷备份。对于灾难恢复而言,RDB 是非常不错的选择。RDB 是经过压缩的数据,体积小
  • 恢复更快。相比于 AOF 机制,RDB 的恢复速度更更快,更适合恢复数据,特别是在数据集非常大的情况
  • 系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。所以,RDB 实际场景下,需要和 AOF 一起使用
  • 由于 RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器卡顿

AOF

  • AOF 的实现可以分为三个步骤:命令追加(append)、文件写入、文件同步(sync)
  • redis 执行一个写命令时,会以协议格式将命令追加到 aof_buf 的缓冲区末尾
  • 在 redis 的事件循环执行周期,处理文件事件时,则会考虑是否将 aof_buf 缓冲区的数据写入到 AOF 文件。这其中有三种策略:1-always aof_buf 数据全部同步到 AOF 文件、2-everysec 每秒同步一次、3-no 不同步
  • 默认是 everysec 策略
  • 如果 AOF 日志过大,redis 会启用 rewrite 机制。在 rewrite log 时,会对其中的指令进行压缩,创建出一份需要恢复数据的最小日志出来。可使用 BGREWRITEAOF 命令 fork 子进程单独处理,不会影响 redis 主进程
  • AOF 的同步频率比 RDB 的同步频率高,如果同时开启 AOF 和 RDB,redis 优先选择 AOF 同步文件

AOF 优缺点

  • AOF 实时同步比 RDB 快 。该机制对日志文件的写入操作采用的是 append 模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容
  • 如果本次操作只是写入了一半数据就出现了系统崩溃问题也不用担心,在 redis 下一次启动之前,可以通过 redis-check-aof 工具来解决数据一致性的问题
  • 对于相同数量的数据集而言,AOF 文件通常要大于 RDB 文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快

redis 内存淘汰策略

  • no-eviction
  • redis 不再继续提供写请求 (DEL 请求可以,读请求也可以)。这可以保证不会丢失数据,但是会让线上的业务不能持续进行,这是默认的淘汰策略
  • volatile-lru
  • 尝试淘汰设置了过期时间的 key,最近最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失(使用最多)
  • volatile-ttl
  • 跟上面一样,只是优先淘汰剩余过期时间 ttl 的最小的 key,ttl 越小越先被淘汰
  • volatile-lfu
  • 从所有配置了过期时间的 key 中淘汰使用频率最少的键
  • volatile-random
  • 从设置了过期时间的 key 中淘汰数据
  • allkeys-lru
  • 区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合
  • allkeys-random
  • 从所有键中随机淘汰 key
  • allkeys-lfu
  • 从所有键中淘汰使用频率最少的键

redis 过期键删除策略

  • 定时删除
  • 在设置键的过期时间的同时,创建一个定时器,让定时器在讲的过期时间来临时,执行对键的删除操作
  • 定时删除会占用CPU时间,响应服务器的响应时间和吞吐量
  • 惰性删除
  • 任由键过期先不删除,但是每次从键空间中获取键时都检查取得的键是否过期,如果过期则删除键
  • 惰性删除浪费太多内存,有内存泄漏的危险
  • 定期删除
  • 每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,则根据多少个过期键和算法决定
  • 定期删除是前两种策略的整合和折中。因为是批量操作,并限定了执行时长和频率,可以有效减少删除操作对CPU的响应,也避免了内存长久不删除的导致的浪费

redis 的过期键删除策略

  • redis 实际使用了惰性删除和定期删除两种策略,合理地在CPU时间和避免浪费空间之中保持平衡
  • 惰性删除的 set 等命令执行
    Redis篇:持久化、淘汰策略,缓存失效策略
  • 惰性删除的 get 等命令执行
    Redis篇:持久化、淘汰策略,缓存失效策略

欢迎指正文中错误

参考文章

Original: https://www.cnblogs.com/cscw/p/15704833.html
Author: 潜行前行
Title: Redis篇:持久化、淘汰策略,缓存失效策略

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571962/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • POI操作EXCEL对象

    POI操作EXCEL对象HSSF:操作Excel 97(.xls)格式XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占用高于HSSFSXSS…

    Java 2023年6月9日
    073
  • 我的大一总结

    图片不太清楚这里附上链接密码: w98f https://udld.github.io/ (老师总结)大一内容总结 编程语言初级使用 C,java (python 未完成) Lin…

    Java 2023年6月5日
    085
  • git 学习笔记

    git status (-s) 查看文件状态git init 创建本地的git仓库git clone 克隆仓库git add [文件名] 添加到缓存区git rest HEAd […

    Java 2023年6月9日
    080
  • 为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?

    TL;DR的回答如下: The restriction to effectively final variables prohibits access to dynamically…

    Java 2023年6月5日
    090
  • nginx与Lua执行顺序

    Nginx顺序 Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序。 Nginx 处理请求的过程一共划分为 11 个阶段,…

    Java 2023年5月30日
    086
  • leetcode 235. Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最近公共祖先(简单)

    一、题目大意 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:”对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个…

    Java 2023年6月14日
    079
  • 设计模式 21 状态模式

    状态模式(State Pattern)属于 行为型模式 在标准大气压下, 水在 0 ~ 100 度之间时,会呈现 液态;在 0 度以下会变成 固态;100 度以上会变成气态。 物质…

    Java 2023年6月6日
    082
  • MYSQL8.0-JSON函数简单示例-JSON_EXTRACT|JSON_VALUE|JSON_TABLE

    JSON类型在日常应用开发中,用得很少,个人通常用于存储常常变化的配置参数。 它适用于什么业务场景,不好说。就好像许多年前读到的一篇文章,说有个国外公司利用ORACLE的CLOB/…

    Java 2023年6月9日
    090
  • Spring 源码(3)Spring BeanFactory 是怎么创建的?

    Spring创建 BeanFactory 的方式 按照 Bean的配置方式手动创建可以分为两种: 使用 XMl配置的 Bean 这种方式使用 xml配置文件配置 Bean的信息并且…

    Java 2023年6月14日
    092
  • 三分钟:极速体验JAVA版目标检测(YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    0135
  • session 和 cookie (转)

    会话(Session)跟踪是Web程序中常用的技术,用来 跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。 Cookie通过在客户端记录信息确定用户身份, S…

    Java 2023年5月30日
    087
  • 【Spring源码分析】Bean加载流程概览(转)

    转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入【Spring源码分析】这个板…

    Java 2023年5月29日
    085
  • 【RocketMQ】事务的实现原理

    事务的使用 RocketMQ事务的使用场景 单体架构下的事务 在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作…

    Java 2023年6月8日
    059
  • 设计模式——策略模式

    策略模式 策略模式是什么呢,可以把策略看成算法,我们通过传递不同的key,从而拿到不同的算法,仔细想想,这不就是if-else吗 原先的if-else逻辑 运行结果 if-else…

    Java 2023年6月8日
    0157
  • 报错:java.lang.NoClassDefFoundError: sun/misc/BASE64Decoder

    本人使用的jdk版本为jdk1.8.0_301,但是仍然报错。 报错如下: 解决办法:使用import org.apache.commons.codec.binary.Base64…

    Java 2023年5月29日
    0136
  • 初识 Nginx

    Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。 Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名…

    Java 2023年5月30日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球