百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

面试官:我问你Redis内存满了怎么办,你竟然告诉我LRU!

mhr18 2024-10-24 11:16 36 浏览 0 评论

我说的是真实情况,有很多候选人都折在这一道看似简单的Redis面试题上。

面试官:“我看你简历上写的熟悉Redis是吧,那你说说如果Redis服务器的内存满了,它将会怎么处理?”

候选人略一思考,说:“如果Redis内存满了的话,那肯定是得进行LRU操作了啊。”

面试官:“你确定会进行LRU吗?那你们redis.conf中的maxmemory-policy参数是如何配置的?”

候选人想了想,似乎什么都没想起来,说:“抱歉,这个我确实不太清楚。”

本文我们就来深入聊聊这道面试题,以及与其相关的底层技术实现原理。

关于maxmemory-policy

我们在上文中所提到的“内存满了”这种说法,是指超出Redis服务器的物理内存限制了吗?其实不是的。

Redis还提供了另外一个配置参数 —— maxmemory,该参数是用来配置内存大小的。一旦Redis所使用的内存超过了该参数,就会启动 maxmemory-policy 中所配置的策略。

这里需要说明的是,对于64位的操作系统,?maxmemory 参数的默认值为0,?表示没有内存大小限制;?而对于32位的操作系统,?maxmemory 参数的默认值为3GB。?

举个例子:

maxmemory 6gb
maxmemory-policy allkeys-lru 或者 volatile-lru


只有这样配置 maxmemory-policy 参数,才如上文中的候选人所说,当Redis的内存满了会进行LRU操作。

其实 maxmemory-policy 参数的配置项有很多,下面且听我一一道来。

noeviction(默认):当Redis所使用的内存达到了maxmemory的时候,就不再提供除了del、hdel、unlink以外的其他写操作,但读操作可以继续进行。

volatile-lru:通过近似LRU(最近最少使用)算法来淘汰Redis中的key,淘汰范围是Redis中设置过期时间的key。

volatile-lfu通过LFU(最不常用)算法来淘汰Redis中的key,淘汰范围是Redis中设置过期时间的key。

volatile-ttl:淘汰Redis中剩余生存时间最短的key,淘汰范围是Redis中设置过期时间的key。

volatile-random:以随机的方式淘汰Redis中的key,淘汰范围是 Redis中设置过期时间的key。

allkeys-lru:通过近似LRU(最近最少使用)算法来淘汰Redis中的key,淘汰范围是Redis中的所有key。

allkeys-lfu通过LFU(最不常用)算法来淘汰Redis中的key,淘汰范围是Redis中的所有key。

allkeys-random以随机的方式淘汰Redis中的key,淘汰范围是Redis中的所有key。

上述的八种策略中,除了noeviction策略之外,剩下的7种策略都会涉及到淘汰key的操作。

而对于淘汰key的判断和执行,是通过每次的用户请求来进行触发的,步骤如下图所示:


LRU 算法和 LFU算法

可能同学们会觉得LRU和LFU两种算法容易混淆,我在这里解释一下。

如果有一条许久不曾被访问的冷数据,偶然间被访问了一次,如果按照LRU算法的规则,这条数据就会被定义为热数据,短期内不会被淘汰。

但按照LFU算法的规则,这条数据可能仍然是最近一段时间内被访问频率最低的,还是会被淘汰掉的。

LRU关注于“最近是否被访问”,LFU关注于“最近的访问频率如何”,相对而言,后者的实现方式更加合理一些。


近似 LRU 算法

标准的LRU算法,其底层是通过双向链表 + Hash表进行实现的,双向链表可以保证数据的插入和删除操作的时间复杂度为O(1),而Hash表可以实现数据查找的时间复杂度为O(1),将两者的优势结合起来堪称完美。

但根据Redis官方文档所述,Redis并没有按照标准的LRU算法进行实现,而是采取了一种“近似LRU”的实现方式。

其原因在于:

(1)Redis内部只实现了Hash表,而标准的LRU算法则需要双向链表 + Hash表两种数据结构。换言之,需要在Redis内存中再额外增加一个双向链表,这个内存消耗的代价是不可接受的。

(2)每个Redis请求,LRU的双向链表也需要进行同步操作,这种实现方式对性能影响不小。

而Redis本身实现的“近似LRU”算法,则远远不需要付出这么大的内存和性能代价,但也牺牲了一些内存淘汰的准确率。

我们来看一下具体的实现方式:

(1)Redis通过引入LRU时钟值的方式,来记录数据每次被访问的时间。

(2)随机挑选出一批数据,将其一一与“按照空闲时间升序排列的”待淘汰数据池中的数据进行比对。

btw:空闲时间 = 当前时钟值 - LRU时钟值,待淘汰数据池的默认大小为16。

  • 若待淘汰数据池中已满,且该数据的空闲时间最小,则跳过;
  • 若待淘汰数据池中未满,且该数据要写入的位置为空,则执行写入操作;
  • 若待淘汰数据池中未满,且该数据要写入的位置不为空,则将目前处于该位置及后面的元素都后移一个位置,再执行写入操作;
  • 若待淘汰数据池中已满,则将数据要写入位置前面的元素都前移一个位置,再执行写入操作;

批次数据的数量,是由 maxmemory-samples 参数来决定的,默认值为5。该参数值设置越大,就越能提升内存淘汰的准确率,但也会增加服务器的CPU消耗。

(3)从待淘汰数据池中,淘汰掉空闲时间最大的那条数据,同时会根据Redis中的惰性删除配置,来决定在Redis字典中执行同步删除还是异步删除。

(4)此时若释放的内存空间未能小于 maxmemory 参数值,则重复执行上述步骤中的(2)(3),直至达成目标为止。

结语

不得不说,这道Redis面试题确实是个好问题,因为其可以由浅及深地挖出来很多Redis的底层实现原理,对候选人的技术水平是个综合且全面的考查。

而换言之,如果候选人能够在技术面试中,有理有据地把这道题所涉及到的技术底层实现原理跟面试官讲清楚,也是一个大大的加分项。

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: