原文作者来源于非科班的科班 ,作者黎杜

概述

「三大缓存问题」只是Redis的其中的一小部分的知识点,想要深入学习Redis还要学习比较多的知识点。

那么今天就带来了一个面试常问的一个问题:「假如你的Redis内存满了怎么办?」 长期的把Redis作为缓存使用,总有一天会存满的时候对吧。

这个面试题不慌呀,在Redis中有配置参数maxmemory可以「设置Redis内存的大小」

在Redis的配置文件redis.conf文件中,配置maxmemory的大小参数如下所示:

实际生产中肯定不是100mb的大小哈,不要给误导了,这里我只是让大家认识这个参数,一般小的公司都是设置为3G左右的大小。

除了在配置文件中配置生效外,还可以通过命令行参数的形式,进行配置,具体的配置命令行如下所示:

倘若实际的存储中超出了Redis的配置参数的大小时,Redis中有「淘汰策略」,把「需要淘汰的key给淘汰掉,整理出干净的一块内存给新的key值使用」

接下来我们就详细的聊一聊Redis中的淘汰策略,并且深入的理解每个淘汰策略的原理和应用的场景。

淘汰策略

Redis提供了「6种的淘汰策略」,其中默认的是noeviction,这6种淘汰策略如下:

  1. noeviction(「默认策略」):若是内存的大小达到阀值的时候,所有申请内存的指令都会报错。
  2. allkeys-lru:所有key都是使用「LRU算法」进行淘汰。
  3. volatile-lru:所有「设置了过期时间的key使用LRU算法」进行淘汰。
  4. allkeys-random:所有的key使用「随机淘汰」的方式进行淘汰。
  5. volatile-random:所有「设置了过期时间的key使用随机淘汰」的方式进行淘汰。
  6. volatile-ttl:所有设置了过期时间的key「根据过期时间进行淘汰,越早过期就越快被淘汰」

假如在Redis中的数据有「一部分是热点数据,而剩下的数据是冷门数据」,或者「我们不太清楚我们应用的缓存访问分布状况」,这时可以使用allkeys-lru。

假如所有的数据访问的频率大概一样,就可以使用allkeys-random的淘汰策略。

假如要配置具体的淘汰策略,可以在redis.conf配置文件中配置,具体配置如下所示:

这只需要把注释给打开就可以,并且配置指定的策略方式,另一种的配置方式就是命令的方式进行配置,具体的执行命令如下所示:

在介绍6种的淘汰策略方式的时候,说到了LRU算法,「那么什么是LRU算法呢?」

LRU算法

LRU(Least Recently Used)即表示最近最少使用,也就是在最近的时间内最少被访问的key,算法根据数据的历史访问记录来进行淘汰数据。

它的核心的思想就是:「假如一个key值在最近很少被使用到,那么在将来也很少会被访问」

实际上Redis实现的LRU并不是真正的LRU算法,也就是名义上我们使用LRU算法淘汰键,但是实际上被淘汰的键并不一定是真正的最久没用的。

Redis使用的是近似的LRU算法,「通过随机采集法淘汰key,每次都会随机选出5个key,然后淘汰里面最近最少使用的key」

这里的5个key只是默认的个数,具体的个数也可以在配置文件中进行配置,在配置文件中的配置如下图所示:

当近似LRU算法取值越大的时候就会越接近真实的LRU算法,可以这样理解,因为「取值越大那么获取的数据就越全,淘汰中的数据的就越接近最近最少使用的数据」

那么为了实现根据时间实现LRU算法,Redis必须为每个key中额外的增加一个内存空间用于存储每个key的时间,大小是3字节。

在Redis 3.0中对近似的LRU算法做了一些优化,Redis中会维护大小是16的一个候选池的内存。

当第一次随机选取的采样数据,数据都会被放进候选池中,并且候选池中的数据会根据时间进行排序。

当第二次以后选取的数据,只有「小于候选池内的最小时间」的才会被放进候选池中。

当某一时刻候选池的数据满了,那么时间最大的key就会被挤出候选池。当执行淘汰时,直接从候选池中选取最近访问时间最小的key进行淘汰。

这样做的目的就是选取出最近似符合最近最少被访问的key值,能够正确的淘汰key值,因为随机选取的样本中的最小时间可能不是真正意义上的最小时间。

但是LRU算法有一个弊端:就是假如一个key值在以前都没有被访问到,然而最近一次被访问到了,那么就会认为它是热点数据,不会被淘汰。

然而有些数据以前经常被访问到,只是最近的时间内没有被访问到,这样就导致这些数据很可能被淘汰掉,这样一来就会出现误判而淘汰热点数据。

于是在Redis 4.0的时候除了LRU算法,新加了一种LFU算法,「那么什么是LFU算法算法呢?」

LFU算法

LFU(Least Frequently Used)即表示最近频繁被使用,也就是最近的时间段内,频繁被访问的key,它以最近的时间段的被访问次数的频率作为一种判断标准。

它的核心思想就是:根据key最近被访问的频率进行淘汰,比较少被访问的key优先淘汰,反之则优先保留。

LFU算法反映了一个key的热度情况,不会因为LRU算法的偶尔一次被访问被认为是热点数据。

在LFU算法中支持volatile-lfu策略和allkeys-lfu策略。

以上介绍了Redis的6种淘汰策略,这6种淘汰策略旨在告诉我们怎么做,但是什么时候做?这个还没说,下面我们就来详细的了解Redis什么时候执行淘汰策略。

删除过期键策略

在Redis中有三种删除的操作此策略,分别是:

  1. 「定时删除」:创建一个定时器,定时的执行对key的删除操作。
  2. 「惰性删除」:每次只有再访问key的时候,才会检查key的过期时间,若是已经过期了就执行删除。
  3. 「定期删除」:每隔一段时间,就会检查删除掉过期的key。

「定时删除」对于「内存来说是友好的」,定时清理出干净的空间,但是对于「cpu来说并不是友好的」,程序需要维护一个定时器,这就会占用cpu资源。

「惰性的删除」对于「cpu来说是友好的」,cpu不需要维护其它额外的操作,但是对于「内存来说是不友好的」,因为要是有些key一直没有被访问到,就会一直占用着内存。

定期删除是上面两种方案的折中方案**,每隔一段时间删除过期的key,也就是根据具体的业务,合理的取一个时间定期的删除key**。

通过「最合理控制删除的时间间隔」来删除key,减「少对cpu的资源的占用消耗」,使删除操作合理化。

RDB和AOF 的淘汰处理

在Redis中持久化的方式有两种RDB和AOF,具体这两种详细的持久化介绍,可以参考这一篇文章[面试造飞机系列:面对Redis持久化连环Call,你还顶得住吗?]。

在Redis中持久化的方式有两种RDB和AOF,具体这两种详细的持久化介绍,可以参考这一篇文章[面试造飞机系列:面对Redis持久化连环Call,你还顶得住吗?]。

「这两个命令都不会把过期的key保存到RDB文件中」,这样也能达到删除过期key的效果。

当在启动Redis载入RDB文件的时候,Master不会把过期的key载入,而Slave会把过期的key载入。

在AOF模式下,Redis提供了Rewite的优化措施,执行的命令分别是REWRITEAOF和BGREWRITEAOF,「这两个命令都不会把过期的key写入到AOF文件中,也能删除过期key」

更多关于redis的大厂面试真题:

  • Redis 与其他 key-value 存储有什么不同?
  • Memcache 与 Redis 的区别都有哪些?
  • Redis 是单进程单线程的?
  • 一个字符串类型的值能存储最大容量是多少?
  • 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
  • 单线程的redis为什么这么快
  • redis的数据类型,以及每种数据类型的使用场景
  • Redis 常见性能问题和解决方案?
  • 为什么Redis的操作是原子性的,怎么保证原子性的?
  • Redis 常见性能问题和解决方案:
  • Redis 的回收策略(淘汰策略)?
  • Pipeline 有什么好处,为什么要用 pipeline?
  • Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
  • Redis 如何设置密码及验证密码?

总结:

redis一直是大厂面试经常会问到的一个重要知识点,所以熟悉和的Redis面试真题对于面试特别重要,上面给大家列举了一部分关于大厂考redis的部分知识点,整理不易,大家有需要这份275页PDF面试真题的,可以关注微信公众号:Java程序员聚集地 获取。

蚂蚁金服java研发岗二面:Redis内存满了该怎么办了相关推荐

  1. 蚂蚁金服Java研发暑期实习的经验总结(已收到Offer)

    文章目录 一.背景 二.决定性因素 2.1 简历 2.2 基础 2.3 项目 2.4 面经 2.5 心态 参考文献 鸣谢 一.背景   简单介绍下,渣985本硕软件工程,2次实习经历(半年互联网.半年 ...

  2. 全新国内互联网一线大厂面经:阿里中间件+蚂蚁金服+头条研发岗+抖音+京东+美团+百度

    前言: 马上就又到了跳槽的好季节,不知道你是不是已经安于现状,还是蓄势待发呢?最近我呢又在搜罗整理大厂的面试题,来来来!我分你一份!加油! 阿里中间件(四面) Java中间件一面 技术一面考察范围: ...

  3. 蚂蚁金服java研发内推电话面

    1.说一个最熟悉的排序算法,思想,复杂度. 2.计算机网络,tcp连接工作流程.三次握手. 3.服务器有很多连接,要查看当前连接我们服务器的连接的连接状态,怎样查.当前服务器有多少连接,这些连接是什么 ...

  4. java内存shell_2019蚂蚁金服Java后端三面,详述程序员必须掌握的架构底层原理

    前面的话 告别了2018 ,也早已正式进入2019 面试一直都是大家关注的热门话题,俗话说"金三银四",如今已经是三月份了,如果你打算在年后跳槽,那么是时候该着手准备了 很多Jav ...

  5. 拼多多、饿了么、蚂蚁金服Java面试题大集

    自己当初找工作时参加过众多一线互联网公司的Java研发面试,这段时间处于寒冬,然而前几天跳槽找工作,两天面了3家,已经拿了两个offer,觉得可以和大家分享下: 下面为拼多多.饿了么.蚂蚁金服.哈啰出 ...

  6. 大牛分享,献出这份年薪68W的蚂蚁金服Java高级开发封神宝典!

    超级大牛经验分享,献出这份年薪68W的蚂蚁金服Java高级开发封神宝典! 干货奉上,不喜勿喷: 一.源码阅读 1.常用设计模式 2.Spring 5 源码 3.MyBatis源码 二.分布式架构总纲 ...

  7. 阿里、腾讯、蚂蚁金服Java技术面试及经验总结(文末分享答案)

    在过去很长一段时间内,国内互联网一直处于三足鼎立状态,BAT即百度.阿里巴巴.腾讯.而在最新的互联网企业价值榜上,百度却被蚂蚁金服挤出前三的位置. 能够进一线互联网公司,是大部分程序员奋斗的目标,有很 ...

  8. 2019社招阿里、腾讯、蚂蚁金服Java面试真题

    在过去很长一段时间内,国内互联网一直处于三足鼎立状态,BAT即百度.阿里巴巴.腾讯.而在最新的互联网企业价值榜上,百度却被蚂蚁金服挤出前三的位置. 能够进一线互联网公司,是大部分程序员奋斗的目标,有很 ...

  9. 阿里、腾讯、蚂蚁金服Java技术面试及经验总结

    在过去很长一段时间内,国内互联网一直处于三足鼎立状态,BAT即百度.阿里巴巴.腾讯.而在最新的互联网企业价值榜上,百度却被蚂蚁金服挤出前三的位置. 能够进一线互联网公司,是大部分程序员奋斗的目标,有很 ...

最新文章

  1. 在Blender中创建惊人的低多边形动画
  2. 基于DDD的.NET开发框架 - ABP初探
  3. python中and与or的执行顺序-python之执行顺序随记
  4. 举例说,在命令模式(Command Pattern)
  5. 用SQL语句添加删除修改字段及一些表与字段的基本操作 .
  6. Hive hiveserver2 配置运行
  7. XCTF-高手进阶区:unserialize3
  8. Dynamics CRM On-Premise V9安装手记
  9. 【学习笔记】JAVA基础——异常处理部分
  10. 如何重装来客电商源码?
  11. 计算机网络教程第五版|微课版 - 相关微课视频
  12. 【渝粤题库】陕西师范大学201821 宋词研究 作业(专升本)
  13. 计算机毕业设计ssm火车站售票管理系统
  14. android开发点击版本号多次无法进入开发者模式模式
  15. ks检验正态分布结果_看SPSS如何检验数据是否服从正态分布
  16. Android 宽高比控件
  17. windows11-USB禁用
  18. jquery插件zoom
  19. 删除电脑被占用的串口
  20. STM32(1)跑马灯

热门文章

  1. UniversalLink通用链接
  2. 404 Note Found· 第七次作业 - 需求分析报告
  3. mongodb 客户端
  4. python的设计具有很强的可读性、相比其他语言_python简介
  5. 使用Fiddler修改inspectors下面的webfoms下的参数怎么改,求可以直接改的方法。
  6. 水沟滑模机施工中技术储备和效果的相得益彰
  7. web项目启动流程分析
  8. 深入理解谷歌最强V8垃圾回收机制
  9. mimikatz在Win10及2012系统以后的明文抓取方式
  10. java图书报刊订阅servlet毕业设计项目