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/714188/

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

(0)

大家都在看

  • 编程语言 = 类型系统 + 运行时

    编程语言 = 类型系统 + 运行时 类型系统 = 描述能力 + 对象模型 + 类型修饰符 + 结合能力 运行时 = 动态派发 + 内存管理 cpu 描述 : 线程 、 算法 、异常…

    技术杂谈 2023年5月31日
    098
  • 深入理解Apollo核心机制之配置读取——轮询

    前两篇内容《深入理解Apollo核心机制之配置读取——前言》《深入理解Apollo核心机制之配置读取——ConfigService定时扫描》 概述 读取配置除了默认5分钟间隔去轮询…

    技术杂谈 2023年7月25日
    079
  • 浏览器端用JS实现创建和下载图片

    问题场景 在前端很多的项目中,文件下载的需求很常见。尤其是通过JS生成文件内容,然后通过浏览器端执行下载的操作。如 图片, Execl 等的导出功能。日前,项目中就遇到了这类需求,…

    技术杂谈 2023年5月31日
    0109
  • []企业的生命周期总结提炼

    [原创]企业的生命周期总结提炼 [原创]企业的生命周期总结提炼 企业生命周期,通常可以分为初创期、成长期、成熟期、衰退期等四个阶段。 做企业一定要”顺势而为&#8221…

    技术杂谈 2023年5月30日
    0125
  • 我是仙人掌社论

    闲话被虎哥扬了,哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊! 遂水篇博客 . 我是仙人掌珂…

    技术杂谈 2023年7月23日
    0100
  • MySQL 关于 only_full_group_by 限制

    先上结论 如果 only_full_group_by 被启用,那么在查询时,如果某个列不在group by 列表中,此时如果不对该列进行聚合处理,则该列不能出现在 select 列…

    技术杂谈 2023年7月11日
    071
  • 【springcloud】3.记一次网关优化

    今天早上过来突然被告知我们提供给外系统的接口服务出问题了,失败率高达20% 很奇怪,昨天周末,今天也没做什么处理,怎么突然变成这样了 1.接口测试 第一反应是接口是不是出问题了,然…

    技术杂谈 2023年7月24日
    079
  • [Python]-numpy模块-机器学习Python入门《Python机器学习手册》-01-向量、矩阵和数组

    《Python机器学习手册——从数据预处理到深度学习》 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对…

    技术杂谈 2023年7月10日
    060
  • 打呼噜治疗方法

    在知乎上看到的: 既然鼾声的真正源头是松弛的咽腔肌肉,最根本的解决方法就是锻炼咽腔肌肉,增强肌肉力量,使它变得结实坚硬。 前三个练习锻炼整个咽腔肌肉,最后一个练习则是单独针对软腭的…

    技术杂谈 2023年6月1日
    095
  • 超酷的元素周期表

    【原文链接】:https://blog.tecchen.tech ,博文同步发布到博客园。由于精力有限,对文章的更新可能不能及时同步,请点击上面的原文链接访问最新内容。欢迎访问我的…

    技术杂谈 2023年7月11日
    0121
  • 千古前端图文教程-HTML003-初次见面HTML

    初次见面HTML 初次见面HTML 编辑器相关 VS Code 的使用 VS Code 的使用 Sublime Text 的使用 HTML的概念 概念:超文本 概念:标记语言 HT…

    技术杂谈 2023年7月11日
    094
  • 【LEETCODE】71、验证二叉树的前序序列化

    简单粗暴,代码有待优化,不过自己独立完成,没有参考任何材料,还是比较满意的 package y2019.Algorithm.stack.medium; import java.ut…

    技术杂谈 2023年7月24日
    059
  • kube-scheduler概念与工作流程

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月24日
    073
  • [转载]Redis 持久化之RDB和AOF

    在正式数据(当然是非生产环境啦)练习以下操作时,一定一定一定记得备份dump.rdb文件。我给自己的服务器添加了aof持久化配置,重启后,发现aof文件为空,就想把rdb文件恢复到…

    技术杂谈 2023年7月10日
    072
  • JavaSE基础笔记(1)

    1、注释 // / / /* / 单行注释 多行注释 文档注释 2、标识符 3、数据类型 整数类型 byte占1个字节范围:-128~127 short占2个字节范围:-32768…

    技术杂谈 2023年7月24日
    084
  • AtCoder Beginner Contest 224

    AtCoder Beginner Contest 224 A – Tires 思路分析: 判断最后一个字符即可。 代码如下: #include using namesp…

    技术杂谈 2023年7月24日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球