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

【Redis】回顾下Redis的过期策略

CSDN话题挑战赛第2期
参赛话题:面试宝典

金九银十之际,一定有很多朋友出去面试,通过每一次的面试,都可以检查一下自己的技术能力是什么样的,所以在面试前的准备是必不可少的环节。
俗话说的好:从不打无准备的仗,方能立于不败之地。面试也是一样,做足够的准备,就一定能够面试成功,所以接来下总结一篇Redis的过期策略相关的面试会问到点和回答方式。

面试时可能会问到Redis的过期策略

  • 面试官:Redis为什么要内存回收?
  • 面试官:Redis的内存回收策略有哪些?
  • 面试官:过期删除策略是什么实现的呢?
  • 面试官:内存淘汰策略是什么实现的呢?
  • 面试官:什么时候会进行淘汰?
  • 面试官:Redis在项目中的哪些地方有用到?
  • 个人经验总结

上一篇有回顾Redis事务机制Redis
可以点链接回顾下这一块的知识点,都知道Redis具备查询效率高,使用简单,方便,基于内存存储的。

面试官:Redis为什么要内存回收?

为了保证Redis能继续提供可靠的服务,Redis需要一种机制清理掉不常用的、无效的、多余的数据,失效后的数据需要及时清理,这就需要内存回收了。

面试官:Redis的内存回收策略有哪些?

主要分为过期删除策略和内存淘汰策略两部分。

面试官:过期删除策略是什么实现的呢?

过期删除策略就是删除set时设置的过期时间超过当前时间的key。主要有三种实现方式:

  • 定时删除:
    对于每一个设置了过期时间的key都会创建一个定时器,一旦到达过期时间就立即删除。该策略可以立即清除过期的数据,对内存较友好,但是缺点是占用了大量的CPU资源去处理过期的数据,会影响Redis的吞吐量和响应时间。

  • 惰性删除:
    当访问一个key时,才判断该key是否过期,过期则删除。该策略能最大限度地节省CPU资源,但是对内存却十分不友好。有一种极端的情况是可能出现大量的过期key没有被再次访问,因此不会被清除,导致占用了大量的内存。

  • 定期删除:
    每隔一段时间,扫描Redis中过期key字典,并清除部分过期的key。该策略是前两者的一个折中方案,还可以通过调整定时扫描的时间间隔和每次扫描的限定耗时,在不同情况下使得CPU和内存资源达到最优的平衡效果。

在计算机科学中,懒惰删除(英文:lazy deletion)指的是从一个散列表(也称哈希表)中删除元素的一种方法。在这个方法中,删除仅仅是指标记一个元素被删除,而不是整个清除它。被删除的位点在插入时被当作空元素,在搜索之时被当作已占据。

在Redis中,同时使用了定期删除和惰性删除。不过Redis定期删除采用的是随机抽取的方式删除部分Key,因此不能保证过期key 100%的删除。

面试官:内存淘汰策略是什么实现的呢?

Redis的内存淘汰策略,是指内存达到maxmemory极限时,使用某种算法来决定清理掉哪些数据,以保证新数据的存入。

Redis的内存淘汰机制包括:

  • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,移除最近最少使用的 key(这个是最常用的)。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,随机移除某个 key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,移除最近最少使用的 key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,随机移除某个 key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,有更早过期时间的 key 优先移除。

在配置文件中,通过maxmemory-policy可以配置要使用哪一个淘汰机制。

面试官:什么时候会进行淘汰?

Redis会在每一次处理命令的时候(processCommand函数调用freeMemoryIfNeeded)判断当前redis是否达到了内存的最大限制,如果达到限制,则使用对应的算法去处理需要删除的key。

在淘汰key时,Redis默认最常用的是LRU算法(Latest Recently Used)。Redis通过在每一个redisObject保存lru属性来保存key最近的访问时间,在实现LRU算法时直接读取key的lru属性。

具体实现时,Redis遍历每一个db,从每一个db中随机抽取一批样本key,默认是3个key,再从这3个key中,删除最近最少使用的key。

面试官:Redis在项目中的哪些地方有用到?

(1)共享session

在分布式系统下,服务会部署在不同的tomcat,因此多个tomcat的session无法共享,以前存储在session中的数据无法实现共享,可以用redis代替session,解决分布式系统间数据共享问题。

(2)数据缓存

Redis采用内存存储,读写效率较高。我们可以把数据库的访问频率高的热点数据存储到redis中,这样用户请求时优先从redis中读取,减少数据库压力,提高并发能力。

(3)异步队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。而且Redis中还有pub/sub这样的专用结构,用于1对N的消息通信模式。

(4)分布式锁

Redis中的乐观锁机制,可以帮助我们实现分布式锁的效果,用于解决分布式系统下的多线程安全问题

个人经验总结

面试过程中不要紧张,找工作面试是双向选择的嘛,心态要好。面试官提的问题对自己知道的呢要表达的有逻辑性,尽量回到问题的点上,不要答非所问这样的话就很难通过面试的。对于不会的呢要巧妙的告知面试官,在其他方面比较占优势一些。面试结束之后要不断的总结归纳,可能同一个问题在下一次面试时又会被问到。所以总结复盘准不会错的,这样空了时候可以找出来查阅一下,才会的记得更牢固一些。

相关文章:

  • Spring4shell远程命令执行(CVE-2022-22965)
  • MySQL之死锁
  • 如何快速晋升自动化测试工程师,10年软测工程师分享的一些经验~
  • 基于k8s搭建部署Nexus服务
  • 处理机调度【操作系统学习笔记】
  • 开源SPL,WebService/Restful广泛应用于程序间通讯,如微服务、数据交换、公共或私有的数据服务等。
  • 炔基聚乙二醇巯基 Alkyne-PEG-SH 炔基PEG硫醇
  • 写作纠错?用机器学习实现单词拼写修正器(附Python代码)
  • 【DjangoDRF+缓存 五万字总结】预计在2022.11月份会再次进行更新
  • 猿创征文|实战开发openGauss DataStudio的sql联想结构
  • VMware创建Linux虚拟机之(三)Hadoop安装与配置及搭建集群
  • 在halcon中使用模板匹配助手进行定位真的很好用!!!
  • 青少年python系列 7.函数
  • python入门——m个位置,每个位置有n种可能,求所有排列结果
  • C | 妙用异或
  • 【css3】浏览器内核及其兼容性
  • 【刷算法】从上往下打印二叉树
  • Android交互
  • Angular2开发踩坑系列-生产环境编译
  • Angular数据绑定机制
  • Bytom交易说明(账户管理模式)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • es6
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Laravel Telescope:优雅的应用调试工具
  • Linux各目录及每个目录的详细介绍
  • MYSQL 的 IF 函数
  • python3 使用 asyncio 代替线程
  • Python实现BT种子转化为磁力链接【实战】
  • Sass Day-01
  • Vue--数据传输
  • 从伪并行的 Python 多线程说起
  • 欢迎参加第二届中国游戏开发者大会
  • 记一次和乔布斯合作最难忘的经历
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 三栏布局总结
  • 手写双向链表LinkedList的几个常用功能
  • 用Visual Studio开发以太坊智能合约
  • # include “ “ 和 # include < >两者的区别
  • (1)(1.11) SiK Radio v2(一)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (done) 两个矩阵 “相似” 是什么意思?
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (南京观海微电子)——COF介绍
  • (十三)Maven插件解析运行机制
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET应用架构设计:原则、模式与实践 目录预览
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [AIGC 大数据基础]hive浅谈