当前位置: 首页 > news >正文

redis面试(五)删除策略和淘汰策略

删除策略和淘汰策略的区别

两个是不同的过程,被淘汰的key,才能被删除掉。

  • 删除策略有惰性删除和定时删除
  • 淘汰策略则有8种可以配置的模式

删除策略

这两种策略是同时存在的,主要处理的是已经过期的数据。

惰性删除

当我们给数据设置过期时间的话,在数据过期后,某个属性会被后台线程标记为“1”,但是这个数据不会被立即删除。
等到我们下次来查询这个数据的时候,会判断一下,数据的这个属性是否为1,是否已经过期,如果过期的话,会把这条数据删除掉,并且返回一个空。

定期删除

后台线程,定期的轮询,随机抽查一批key,看是否过期,如果过期了,就删除掉过期的key。(这里有的说是20个,有的说是一批,等我翻一翻官方文档再补充)
如果这批key中,过期的数据占比超过25%的话,就再查询一次。
知道抽查数据中过期数据占比低于25%的话,就不在执行。

淘汰策略

淘汰策略主要是针对那些没有过期时间的数据,当redis中数据量过大,内存不足的时候,会触发淘汰策略。
maxmemory控制redis使用的最大内存量,一定要设置,内存满了以后,就有策略来,
maxmemory-policy:
● noeviction(不清理,阻塞所有指令,不再执行)
● volatile-lru(lru清理超时key,一直到空间足够,如果还是不行就退回到noeviction)
● allkeys-lru(对所有key执行lru清理,不管超时没超时)
● allkeys-random(随机清理任何key)
● volatile-random(随机删除过期key)
● volatile-ttl(清理最近马上要过期的key)

LRU算法

LRU 算法全称 Least Recently Used,按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中。LRU 会把所有的数据组织成一个链表,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据和最近最不常用的数据。

经常使用的都会跑到头部,不经常使用的会在尾部。所以删除的话就是从尾部开始删除。

但是由于可能会有那种,突然在某个时间访问了几次的数据,跑到了头部。但是很长时间之后都不会再有访问的这种瞬时热点数据。
而lru的链表又恰好比较长的话,也是会造成一定的资源浪费,所以redis做了一个lru的链表优化。叫做LFU

LFU算法

简单来说,就是当数据key被访问的时候,不会直接将其放到链表的头部,而是通过一系列访问次数、访问时间间隔、衰减因子等等数据,将其慢慢的提升到头部。
这样可以避免那些短时间方位之后,再没有访问过的数据,可以更快的衰减到尾部。
而那些,定时访问的数据,可以长时间的停留在缓存中,不会被哪些瞬时热点数据挤到尾部。
详细的计算过程这里就不展开讲了,有兴趣的同学可以去百度一下。 如果真的能面试到这个地步的话,并且还要往下深挖的话,相信你一定是进了大厂,那算法底子肯定不错,会在算法中遇到这种问题的。
或者说,之前在mysql面试系列(四)中,我介绍了有关lru冷热算法的例子,可以将哪些去说一下,也是很优秀的淘汰算法。

总结

好了,关于redis的基础知识,到这里就差不多了,后面会去深挖一下分布式锁redisson的源码,剖析一下分布式锁设计过程中会遇到哪些问题,哪些通点。希望能给大家在面试中提供一点点帮助。

题外话

其实很多设计思想,各种策略,比如什么分布式锁,淘汰机制,什么CAP理论,中间的好多原理都是共通的。当我们学习到一部分领域知识的时候,希望大家可以学会提出疑问,举一反三,带着问题再往下深挖。然后你会发现,知识越来越清晰明朗。

或者是在学习某个部分的时候,脑子感觉有些秀逗,不知道为什么他一定要这样做。
别急,先记下来,再去不断地学习相关知识点。 直到有一天你看到某个东西,就会突然灵光一闪,哦~~ 哦~~!! 原来当初的问题是因为这个!!! 这种醍醐灌顶的感觉是很爽的, 希望大家越来越好,学到的知识越来越多,走的越来越远,加油,共勉。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Excel列名转换
  • 54、PHP 实现希尔排序
  • 选择 websim网站:一个用自然语言快速构建生成功能齐全的网站
  • 8月4号分析:CSGO市场行情如何,给几个操作建议
  • C++——string类及其使用
  • TeleVis:基于NLP的新冠新闻舆情可视化项目
  • YOLOv8改进 | 注意力机制 | 反向残差注意力机制【内含创新技巧思维】
  • ShardingProxy使用自定义策略,数据迁移方案
  • 排序算法:归并排序,golang实现
  • C语言自定义类型联合体与枚举超详解
  • Python中的“@”,有什么用?
  • 【Tessent】【Command】set_design_level Design Level
  • 【系统架构设计师】二十四、安全架构设计理论与实践⑤
  • 双算法https证书获取指南
  • win10自带dll修复丢失的几种方法,快速修复错误dll文件的方式
  • 2018一半小结一波
  • 77. Combinations
  • E-HPC支持多队列管理和自动伸缩
  • js写一个简单的选项卡
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 物联网链路协议
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 白色的风信子
  • C# - 为值类型重定义相等性
  • ​secrets --- 生成管理密码的安全随机数​
  • ​低代码平台的核心价值与优势
  • #DBA杂记1
  • #pragma pack(1)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (4.10~4.16)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)为C# Windows服务添加安装程序
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .Net - 类的介绍
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 8.0 发布到 IIS
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET开源项目介绍及资源推荐:数据持久层
  • @PostConstruct 注解的方法用于资源的初始化
  • [1181]linux两台服务器之间传输文件和文件夹
  • [20171106]配置客户端连接注意.txt
  • [2019红帽杯]Snake
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解