@cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

v2-374b38a72eca61c0240875676a44edd4_1440w.jpg?source=172ae18b

大家好,今天我和大家想聊一聊有关redis的过期策略的话题。

听到这里你也许会觉得:“我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?”

话虽如此·,但是兄die,如果你连标题上问题都不知道,上来就懵了,回答不出来,那面试官就有可能有这样的担心:

“这小伙子对这些问题一无所知,会不会想当然的认为写进 redis 的数据就一定会存在,后面导致系统各种 bug,谁来负责呢?”

说到这,你还会觉得这样的问题毫无意义吗?

在开始正题之前,我想问大家这样的两个问题:

1. 往 redis 写入的数据怎么没了?

可能有同学会遇到,在生产环境的 redis 经常会丢掉一些数据,写进去了,过一会儿可能就没了。

我的天,同学,你问这个问题就说明 redis 你就没用对啊。redis 是缓存,你给当存储了是吧?

啥叫缓存?

用内存当缓存。内存是无限的吗,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。

可能一台机器就几十个 G 的内存,但是可以有几个 T 的硬盘空间。redis 主要是基于内存来进行高性能、高并发的读写操作的。

那既然内存是有限的,比如 redis 就只能用 10G,你要是往里面写了 20G 的数据,会咋办?

当然会干掉 10G 的数据,然后就保留 10G 的数据了。

那干掉哪些数据?保留哪些数据?当然是干掉不常用的数据,保留常用的数据了。

2. 数据明明过期了,怎么还占用着内存?

这是由 redis 的过期策略来决定。

有了以上的铺垫,我们闲言少叙正题现在开始:

redis 过期策略

redis 过期策略是:定期删除+惰性删除

所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。

假设 redis 里放了 10w 个 key,都设置了过期时间,你每隔几百毫秒,就检查 10w 个 key,那 redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 key 上了。

注意,这里可不是每隔 100ms 就遍历所有的设置过期时间的 key,那样就是一场性能上的灾难

实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。

但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?

所以就是惰性删除了。这就是说,在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。

获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。

但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?

如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?

答案是:走内存淘汰机制

内存淘汰机制

redis 内存淘汰机制有以下几个:

  • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除

手写一个 LRU 算法

你可以现场手写最原始的 LRU 算法,那个代码量太大了,似乎不太现实。

不求自己纯手工从底层开始打造出自己的 LRU,但是起码要知道如何利用已有的 JDK 数据结构实现一个 Java 版的 LRU。

v2-53803f65a2dc9b2f401e9092533f74e5_b.jpg

END

石杉的架构笔记(id:shishan100)
作者:中华石杉,多年BAT架构经验倾囊相授

作者:石杉的架构笔记

链接:http://www.imooc.com/article/289884

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux终端贪吃蛇,分享|nSnake: 在Linux的终端上玩经典的贪食蛇游戏

你知道20世纪末的那些古老的诺基亚手机上最棒的东西是什么吗? 贪食蛇! 我以前在这个看似无聊但却让人上瘾的游戏上花费了大把的时间。在古老的诺基亚手机被智能手机取代的同时,贪食蛇也被另外的无聊但却令人上瘾的游戏取代了,比如说&#xff…

vue 组件之间数据传递(七)

1、props:父组件 -->传值到子组件 app.vue是父组件 ,其它组件是子组件,把父组件值传递给子组件需要使用 >props 在父组件(App.vue)定义一个属性(变量)sexVal 男 把该值传递给 子组件(B.vue)&#x…

人在旅途之桂林

先说下这篇文章是多图的所以看文章的同学最好在wifi环境下之前有发文章说我们学院建院十周年所以,哈哈哈,就有机会回桂林嗨皮了出发的时候车子没电了,叫了保险过来搭电搞了一段时间,不过不影响我们顺利到达桂林第一时间先吃碗米粉…

python pyecharts 折线图_python数据大屏pyecharts库2020.8.31

数据大屏V0.1-2020.8.31前言千辛万苦,找到了python能实现数据大屏库pyecharts。1、https://gallery.pyecharts.org/#/Page/page_simple_layout2、主要是3个类,Grid:并行多图,Page:顺序多图,Tab:…

linux文件管理器添加项目,LXQt 0.14 发布,文件管理器添加拆分视图

LXQt团队已经发布了他们的轻量级Qt5支持的Linux桌面环境的0.14.0版本。LXQt 0.14为PCManFM-Qt文件管理器添加了一个拆分视图,其桌面图标角色现在支持计算机/网络/垃圾箱图标,通过libfm-qt改进更有效地处理挂载,LXImage-Qt现在可以处理图像EXI…

计算机基础系列一:计算机硬件

一.计算机硬件/操作系统/软件/网络1.1软件的最终目的是控制硬件 1.2程序就是写的代码 就是为了更好的控制硬件 但是需要先控制 CPU 硬盘等硬件1.3学习python语言的目的是为了写软件 python的单词就是关键词 模仿就是多练习熟练度1.4 cpu主要关键功能就是…

这两天,我们还没毕业

这两天在桂林,见了很多几年没见面的同学,从毕业后到现在,应该是人数最多的一次聚会了,如果用两个字来形容这次聚会,那应该是 「满足」两字。满足于多年没有见面的老同学,从天南聊到地北,从球场聊…

python parser count_8个超实用的Python脚本,收藏备用

脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作。例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而确定问题在于什么。完成这…

linux强制使用windows命名,如何强制Windows重命名带有特殊字符的文件?

在Windows 7中:在管理员模式下运行cmd.exe。cd进入带有文件名的目录。运行:chkdsk / V / f [我的错误文件在OS驱动器之外的其他驱动器上,因此它可以卸除它。如果是OS驱动器,则可能必须在启动时执行此步骤。等待(可能必须重新启动)…

2.Cannot find config.m4.

PHP扩展路径在:PHP源码包下的ext目录下;这个目录下有很多自带的扩展源码,缺少什么扩展只需要进入这个扩展目录下,再运行Phpize即可;转载于:https://www.cnblogs.com/52-hz/p/7155348.html

LCD 设备驱动框架分析及核心结构

Linux 下很多东西都是和结构体相关,举个例子,时钟大家都知道吧,Linux 下对应时钟的东西就有好几个结构体,所以你要是想明白Linux 下那些东西,对结构体要有所了解,LCD 是基础的驱动设备,里面涉及…

kafka 启动_Kafka管理工具Kafka Manager

Kafka作为分布式消息系统以其轻量级、可扩展、高通吐等特点而得到广泛应用,最近在项目中用Kafka作为中间件进行数据交互。为了监控Kafka的运行情况,在网上找了个开源的Kafka监控工具Kafka-manager对Kafka集群监控。为什么选用Kafka-manager而不是KafkaOf…

linux 简单脚本fi报错,shell脚本报错:[: =: unary operator expected

shell脚本报错:"[: : unary operator expected"在匹配字符串相等时,我用了类似这样的语句:if [ $STATUS "OK" ]; thenecho "OK"fi在运行时出现了 [: : unary operator expected 的错误,就一直找不…

Linux背后的思想

01Linus TorvaldsLinus Torvalds两次改变了技术,第一次是Linux内核,它帮助互联网的发展;第二次是Git,全球开发者使用的源代码管理系统。在一次TED的采访中,Torvalds以极其开放的态度讨论了他独特的工作方式和性格特点。…

【HDOJ 3652】B-number

【HDOJ 3652】B-number 给一整数n 找<n的整数中能被13整除且含有13的 数位dp 记忆化&#xff01;。 一入记忆化深似海。。。再也不想用递推了。。。发现真的非常好想 仅仅要保证满足条件把未选高位(即能任意挑数的)记录下来 不断搜索递归即可 代码例如以下: #include <i…

linux执行sh提示非标准环境,Linux执行.sh文件时提示No such file or directory该怎么办(三种解决办法)...

先给大家看下问题描述&#xff0c;下图是我在运行时出现错误截图&#xff1a;解决方法分析原因&#xff0c;可能因为我平台迁移碰到权限问题我们来进行权限转换1)在Windows下转换&#xff1a;利用一些编辑器如UltraEdit或EditPlus等工具先将脚本编码转换&#xff0c;再放到Linu…

你应该知道Linux内核softirq

说起这个softirq &#xff0c;很多人还是一头雾水&#xff0c;觉得这个是什么东西&#xff0c;跟tasklets 和 workqueue有什么不同。每次谈到这个&#xff0c;很多人&#xff0c;包括我&#xff0c;都是有点紧张&#xff0c;特别是面试的时候&#xff0c;因为你一旦说错了什么&…

linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍...

Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍作者&#xff1a;北南南北来自&#xff1a;http://doc.xuehai.net提要&#xff1a;Linux 磁盘分区表、文件系统的查看、统计的工具很多&#xff0c;有些工具是多功能的&#xff0c;不仅仅是查看磁盘的分区表&#x…

Java部分面试题

一、Vector和ArrayList的区别1&#xff0c;vector是线程同步的&#xff0c;所以它也是线程安全的&#xff0c;而arraylist是线程异步的&#xff0c;是不安全的。如果不考虑到线程的安全因素&#xff0c;一般用arraylist效率比较高。2&#xff0c;如果集合中的元素的数目大于目前…

C语言,链表

定义一个链表的节点之前说到树&#xff0c;里面也有一个节点&#xff0c;节点是用来存数据的&#xff0c;不管是树还是其他什么数据结构&#xff0c;最终的目的都是用来处理数据的&#xff0c;所以节点里面包含两个东西&#xff0c;一个是指针&#xff0c;指针可以指向其他位置…