2022程序员进阶宝典,微众银行java面试经验
前言
Redis作为基于键值对的NoSQL数据库,具有高性能、丰富的数据结构、持久化、高可用、分布式等特性,同时Redis本身非常稳定,已经得到业界的广泛认可和使用。因此,作为一个Java开发者,掌握Redis早就成了一项必备技能之一。
今天,想跟大家分享这份腾讯Redis压轴笔记,关注到了Redis开发方方面面,尤其是对于开发中如何提高效率,减少可能遇到的问题进行详细分析,不单单介绍怎么解决这些问题,而是通过对Redis重要原理的解析,帮助开发人员学会找到问题的方法,理解背后的原理,从而让开发人员不仅知其然,而且知其所以然。因此,也收获了圈内大佬的一致好评。
1、我往Redis里写的数据怎么没了?
使用Redis的同学你要明白一点,你为什么用Redis?用redis的作用是什么?用redis的好处是什么?凡事多思考一下为什么,多想想背后的原因。
就在不久前有朋友跟我说过,说他们生产环境的Redis怎么经常会丢掉一些数据?写进去了,过一会儿可能就没了。我的天啊,你问这个问题就说明Redis你就没用对啊。Redis是缓存,你给当存储了用了是吧?
首先要明白一点啥叫缓存?为啥用缓存?
Redis是用内存当缓存的。内存是无限的吗?相反,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个G的内存,但是可以有几个T的硬盘空间。Redis主要是基于内存来进行高性能、高并发的读写操作的。
那既然内存是有限的,比如Redis就只能用10个G,你一直往里面写数据,一直写一直写最后10个G都用的差不多了,你还写会,你想想会发生什么?当然会干掉一些的数据了,然后就保留10个G的数据。你说会不会造成数据丢失?
那Redis会干掉哪些数据?保留哪些数据呢?当然是干掉不常用的数据,保留常用的数据了。
所以说,这是缓存的一个最基本的概念:数据是会过期的。要么是你自己设置个过期时间,要么是Redis自己给干掉。
所以你的Redis如果使用不当,把生产数据存到里面,又没有去持久化到mysql,那就会有丢失的可能。
2、我的数据明明都过期了,怎么还占用着内存啊?
还有一种就是如果你给key设置好了一个过期时间,你知道到一定的时间再去查这个key就没有了,但是你知道redis是怎么给你弄成过期的吗?什么时候删除掉?
如果你不知道,在实际的使用过程中你就可能会发现这么一个问题:为啥好多数据明明应该过期了,结果发现redis内存占用还是很高?那是因为你不知道Redis是怎么删除那些过期key的。
举例,Redis 内存一共是10个G,你现在往里面写了5个G的数据,然后你对这些数据全都设置了10分钟之后过期,结果10分钟之后,你再来查看看,Redis的内存使用率怎么还是50%呢?5个G的数据都过期了,我从redis里查,是查不到了,结果过期的数据为啥还占用着Redis的内存呢。
如果你连这个问题都不知道,上来就懵了,回答不出来,建议你使用Redis之前多做做功课,不然你写代码的时候,想当然的认为写进Redis的数据就一定会存在,后面导致系统各种漏洞和bug,就不好弄了。
3、问题剖析
(1)设置过期时间
set key value 过期时间(1小时)
表示set进去的key,1小时之后就没了,就失效了。
我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时?10分钟?这个很有用,我们自己可以指定缓存到期就失效。
如果假设你设置一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?
答案是:定期删除+惰性删除
所谓定期删除,指的是Redis默认是每隔100ms就随机抽取
一些设置了过期时间的key,检查其是否过期,如果过期就删除。
为什么是随机抽取?
假设Redis里放了10万个key,都设置了过期时间,你每隔几百毫秒,就检查10万个key,那redis基本上就死了,因为这样cpu负载会很高的,全都消耗在你的检查过期key上了。
所以这里可不是每隔100ms就遍历所有的设置过期时间的key,Redis如果设置成检查所有Key那将是一场性能上的灾难。所以实际上redis是每隔100ms随机抽取
一些key来检查和删除的。
但是问题是,随机抽取检测key是否过去会导致定期删除
策略可能会导致很多过期key到了时间并没有被删除掉,那咋整呢?所以Redis还有另一个策略就是惰性删除
。
惰性删除 就是说,在你获取某个key的时候,Redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。
所以并不是key到时间就被删除掉,而是你查询这个key的时候,Redis再懒惰的检查一下。
通过上述两种手段,保证过期的key一定会被干掉。
那么刚才的问题就不难理解了,就是说,你的过期key,靠定期删除没有被删除掉,还停留在内存里,占用着你的内存呢,除非你的系统去查一下那个key,才会被redis给删除掉。如果都过期了,定期删除才删了一点点,而你又没有去查,没有触发惰性删除,那么短时间内你的redis内存占用率还是会下不来。
但是实际上这还是有问题的,如果定期删除漏掉了很多过期key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期key堆积在内存里,导致redis内存块耗尽了,咋整?
别担心Redis还有方案:内存淘汰机制。
(2)内存淘汰策略
如果Redis的内存占用过多的时候,此时会进行内存淘汰,Redis提供如下丰富的可选策略:
1)noeviction:
当内存不足以容纳新写入数据时,新写入操作会报错。
(这个一般没人用吧,实在是太恶心了)
2)allkeys-lru:
当内存不足以容纳新写入数据时,在所有键空间中,移除最近最少使用的key
(这个是最常用的)
3)allkeys-random:
当内存不足以容纳新写入数据时,在所有键空间中,随机移除某个key。
(这个一般没人用吧,为啥要随机,把我重要的key干掉了咋整,肯定是把最近最少使用的干掉)
4)volatile-lru:
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
(这个一般不太合适)
5)volatile-random:
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
6)volatile-ttl:
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
例如:Redis 里有10个key,现在内存已经满了,设置的淘汰策略是allkeys-lru
,此时Redis需要删除掉一些key来保证你可以继续写入。在这10个key中,其中1个key,最近1分钟被查询了100次,1个key,最近10分钟被查询了50次,1个key,最近1个小时被查询了1次。肯定那些最近最少使用的被干掉了。
为啥存redis的数据有时候会丢失?
很简单,你写的数据太多了,内存占满了,或者触发了什么条件,如redis使用了allkeys-lru内存淘汰策略,自动给你清理掉了一些最近很少使用的数据。
最后的话
无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!
部分截图:
于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!**
部分截图:
[外链图片转存中…(img-n0OHD1iV-1651830558326)]
2022程序员进阶宝典,微众银行java面试经验相关推荐
- 微众银行软件测试笔试题,微众银行--java面试题一
阅读目录 微众银行简介 1,项目相关 因人而异,此处不给出标准答案 1.1 自我介绍,项目 1.2 项目中的难点,怎么解决的 1.3 项目中有没有用到新技术 1.4 最近有没有做什么项目 2,java ...
- 2021程序员进阶宝典!工信部java中级软件工程师
第一个 分布式:限流 1.1 ZooKeeper+Nginx面试常备题(附答案) ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Ha ...
- 为何优秀的程序员不断离开?,中高级Java面试中你不得不会的知识点
以下为译文: 鉴于我刚刚换了份新工作,所以最近有很多人问我为何有此决定. 一般来说,每当有人离职时,同事.经理.人力资源,甚至朋友和家人都想知道其中的原因.就我个人而言,我一般会给出不太让人满意的答案 ...
- 近期想跳槽的程序员必看!阿里P7级别面试经验总结,使用指南
开头 技术的发展产生了程序员这个职位,从这些年各大互联网公司曝光的一些员工收入水平来看,程序员的工资还是相对比较高的,可是我们在互联网上还听到了另外一种声音,很多程序员想转行,特别是大龄程序员,这可能 ...
- Android 贝塞尔曲线实战之网易云音乐鲸云特效,2021程序员进阶宝典
一阶这个比较简单,因为没有在网上找到可以直接输入数学公式的工具,就手工推导了下. ![在这里插入图片描述](https://img- <Android学习笔记总结+最新移动架构视频+大厂安卓面试 ...
- 优秀Android开发源码合集(附解析)程序员进阶宝典
源码就像乐高积木,如果你想了解它们是怎么组装在一起的,你需要和它交互,有时甚至要把它拆开. 阅读源码的过程对于Android开发者大有裨益, 优秀的源码都极具营养,不仅蕴含大神的思维模式,还有很多值得 ...
- Kotlin 集合函数锦集,2021程序员进阶宝典
postfix = "的排名",limit = nameCollection.size,truncated = "等 " ) println(message) ...
- 微众银行java开发待遇如何,内含福利
第1章:Dubbo的简史.后续的规划和整体架构大图 ----Dubbo高性能RPC通信框架 1.1应用架构演进过程 1.2 Dubbo 简介 1.3 Dubbo总体大图 第2章:Dubbo的环境配置和 ...
- 面经之微众银行外包面试
面试官专攻dubbo,问了很多dubbo的问题,且问题偏向原理及实践,需要在平时工作中使用时常思考才能解答. 罗列几个典型且我没回答上来的问题.引用中附上chantGPT的回答. dubbo与spri ...
最新文章
- 计算机网络:单播,多播
- android应用开发全程实录出版
- 对require和import的认识
- 分享SSRF漏洞的学习和利用
- “团队禁止使用Lombok”,被我狠狠的反驳了!
- 递归删除目录下.svn文件
- boost::mp11::mp_invoke_q相关用法的测试程序
- SAP CRM WebClient UI配置的加载逻辑
- Tomcat 比 nio 、aio性能更好的apr介绍
- mysql存储过程in_在MySQL存储过程中使用WHERE IN()
- Android使用BaseAdapter绑定ListView实现不同item的TextView多种文字变色
- 从零开始做一个开源项目 学习笔记
- 文件的HANDLE转化为FILE*!!!
- 利用python调用百度api实现黑白图像处理
- oracle golden gate 价格,Oracle GoldenGate
- 美团到店Java二面:TCP 糊涂窗口综合症面试题汇总解析
- 鸭子-策略模式(Strategy)
- 计算机无法验证签名,win7系统无法验证文件数字签名的解决方法
- [凯圣王]减脂挑战第15天变化/饮食思路分享/碳水循环+轻断食/GI值和GL值的应用/碳水后置的理论基础
- kubernetes存储 -- Configmap应用配置管理
热门文章
- CQ40 开机 caps lock scroll灯闪 一直闪 黑屏啊·进不了windows界面
- Hessian 协议解析
- java读取文件内容并且换行符,看完这一篇你就懂了
- UNI-APP_苹果底部栏自适应配置
- simulink中比scope模块还好用的平替出图工具?
- dapper mysql 多参数查询_使用Dapper进行参数化查询
- Promise使用,promise原理,手写promise
- 设置webhook_Webhook模式
- 原来这就是java的缓存技术,你知道吗?
- FileMaker Pro 18 Advanced Mac(数据库软件)