前言

今天的分享主要是讲下这个 redis,什么是缓存雪崩、穿透和击穿。这三个技术问题是我们平时开发工作中和面试过程中,必须要会的知识点,因为目前的互联网系统没有几个不需要用到缓存的,只要用到缓存的话,就需要掌握这三个技术问题。

基本上无论哪个老哥去大厂面试,都会被问题这几个问题,所以作为一个互联网开发程序员来说,这个几个技术问题大家是需要搞懂的。而解决这几个问题的方案,通常有布隆过滤器,还有分布式锁。

布隆过滤器是1970年的一项技术,距今也有50年了,之所以能够应用至今,说明这项技术还是挺优秀的,它也是谷歌搜索引擎所采用的一项技术,非常的火。这里就不展开说这个布隆过滤器了,后续会专门用一篇文章来讲这个布隆过滤器和分布式锁

接下来我们正式来说下什么是redis的缓存雪崩、穿透和击穿

4 年经验应该具备哪些技能

首先,简单的聊一下我认为的 4 年经验左右、优秀的 Java 程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容。

专业技能方面

  • 基础:JDK 常用类的原理、源码、使用场景。
  • 设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。
  • 数据结构:数组、链表、栈、队列、树。
  • 网络:TCP、HTTP、HTTPS、负载均衡算法。
  • 框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的扩展点、MyBatis 的核心流程。
  • 中间件:常用中间件的核心原理与最佳实践,并对其中的 1 到 2 个有深入的学习,Redis、Kafka(RocketMQ、RabbitMQ)、Dubbo、Zookeeper。
  • 数据库(MySQL):索引原理、隔离级别、锁机制、分库分表、慢 SQL 定位及优化、线上问题解决。
  • Netty:NIO 原理、核心组件、I/O 多路复用(epoll)、零拷贝。
  • JVM:运行时数据区、垃圾回收算法、垃圾回收器(CMS、G1)、常用配置参数、线上问题定位及解决。
  • 稳定性保障:隔离、限流、熔断、降级等。
  • Linux:基本命令的使用、快速定位和排查问题。
  • 分布式理论:CAP、BASE、2PC、3PC、TCC。

项目方面

  • 能独立完成一个复杂模块的需求分析、方案设计和最终落地实现。
  • 能不断思考,寻找更优的设计和解决方案,积极优化慢 SQL、慢服务。
  • 具备排查问题的能力,遇到线上问题能及时定位和修复上线,例如:数据库死锁、服务器宕机、服务器 Full GC 频繁等。
  • 具备难题攻关的能力,能不断解决项目遇到的挑战,能给予初级工程师技术上的指导。
  • 初步具备带领团队(1-3人左右)的能力,能合理分配需求,做好进度把控、风险评估、Code Review。

严格来说,要完全做到上面这些有点难,我自己也并不具备,但是,我们可以将其视为目标,不断去努力。

面试常见形式

大厂面试通常是“连环炮”的形式,举个栗子:

面试官:用过哪些 Map

我:LinkedHashMap、ConcurrentHashMap、HashMap、TreeMap

面试官:这四种 Map 的区别

我:ConcurrentHashMap 线程安全,LinkedHashMap 可以记录插入顺序和访问顺序,TreeMap 可以自定义排序,除了这几个场景,其他场景基本都可以使用 HashMap

面试官:ConcurrentHashMap 怎么保证线程安全

我:JDK 1.8 以前通过分段锁,JDK 1.8 以后通过 CAS + Synchronized

面试官:ConcurrentHashMap 在 JDK 1.8 前后的锁有什么区别

我:JDK 1.8 以前锁分段,JDK 1.8 以后锁单个节点,锁粒度降低,并发度变高

这种模式的问法,其实就是想了解候选人对一个知识点的理解是仅仅停留在表面,还是真的去深入研究过。

面试内容

下面介绍下一些常见的面试内容,其中的面试题不一定是我真实遇到的,有可能是从别人的面试题中收集的,也有可能是我自己觉得重要的知识点,仅供参考。

1、项目

项目对于一个 3 - 5 年经验的开发来说是非常重要的,面试官也非常看重这一块。这个经验的开发基本是各大公司的编码主力,因此面试这个年限的候选人,通常项目是很重要的一块。面试官通常会让你先自己介绍下自己参与度最高(或者最牛逼)的项目,然后从中进行提问。常见的如以下:

  • 介绍下你参与度最高的项目
  • 画下项目的架构图
  • 如果核心流程处理到一半,服务器崩溃了,会怎么处理
  • 项目中遇到过哪些挑战或问题,怎么解决的
  • 项目的稳定性和可用性怎么保障
  • 数据安全这块怎么设计
  • 项目的技术选型,为什么选这些

2、场景题

越到后面的面试官,越喜欢问场景题,场景题比较考验候选人平时的积累和解决问题能力。这个环节很容易挂掉一批人,特别是容易紧张的同学,很容易脑子会一片空白。场景题的核心一般是处理大数据量的问题、解决性能方面的问题。

场景题本质上是比较开放的,没有什么标准答案,只要自己的方案能够解决问题,能够“自圆其说”就行。

这个环节面试官可能会将线上真实的场景拿出来提问,我自己就遇到过。

3、专业技能

集合

  • 经常用到哪些 Map
  • 这几种 Map 的区别
  • CocurrentHashMap 怎么保证线程安全
  • CocurrentHashMap 在 JDK 1.8 前后的锁有什么区别
  • 聊下 HashMap 的原理
  • HashMap 在 Put 时,新链表节点是放在头部还是尾部
  • HashMap 扩容时的流程
  • HashMap 在 JDK 1.8 有什么改变
  • CocurrentHashMap 在 JDK 1.8 有什么改变
  • TreeMap 的原理
  • Map、List、Set 分别说下你知道的线程安全类和线程不安全的类

多线程、锁

  • 线程池使用的是哪种
  • 线程池参数怎么配置
  • 线程池各个参数的作用
  • 线程池的参数配置要注意什么
  • 线程池的工作流程
  • JDK 中的并发类知道哪些
  • AQS 的底层原理
  • 介绍下悲观锁和乐观锁
  • 使用过哪些锁
  • synchronized 和 Lock 的区别、使用场景
  • synchronized 原理
  • synchronized 作用于静态方法、普通方法、this、Lock.class 的区别
  • 为什么引入偏向锁、轻量级锁,介绍下升级流程
  • 死锁的必要条件,如何预防死锁
  • 介绍下 CountDownLatch 和 CyclicBarrier
  • 介绍下 CAS,存在什么问题
  • 介绍下 ThreadLocal,存在什么问题

网络

  • HTTPS 是怎么加密的
  • 普通 Hash 和一致性 Hash 原理
  • 一致性 Hash 的缺点
  • TCP 三次握手过程,为什么需要三次握手
  • 为什么 TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSE 状态
  • TCP 的拥塞控制
  • TCP 如何解决流控、乱序、丢包问题
  • 为什么会出现粘包和拆包,如何解决

Spring、Mybatis

  • Mybatis 中 # 和 $ 的区别
  • 怎么防止 SQL 注入
  • 使用 Mybatis 时,调用 DAO(Mapper)接口时是怎么调用到 SQL 的
  • 介绍下 Spring IoC 的流程
  • BeanFactory 和 FactoryBean 的区别
  • Spring 的 AOP 是怎么实现的
  • Spring 的事务传播行为有哪些,讲下嵌套事务
  • 什么情况下对象不能被代理
  • Spring 怎么解决循环依赖的问题
  • 要在 Spring IoC 容器构建完毕之后执行一些逻辑,怎么实现
  • @Resource 和 @Autowire 的区别
  • @Autowire 怎么使用名称来注入
  • bean 的 init-method 属性指定的方法里用到了其他 bean 实例,会有问题吗
  • @PostConstruct 修饰的方法里用到了其他 bean 实例,会有问题吗
  • Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错
  • Spring 中,bean 的 class 属性指定了一个不存在的 class,会报错吗,如果会报错,在哪个阶段
  • Spring 中的常见扩展点有哪些

MySQL

  • MySQL 索引的数据结构
  • 为什么使用 B+ 树,与其他索引相比有什么优点
  • 各种索引之间的区别
  • B+ 树在进行范围查找时怎么处理
  • MySQL 索引叶子节点存放的是什么
  • 联合索引(复合索引)的底层实现
  • MySQL 如何锁住一行数据
  • SELECT 语句能加互斥锁吗
  • 多个事务同时对一行数据进行 SELECT FOR UPDATE 会阻塞还是异常
  • MySQL 使用的版本和执行引擎
  • MySQL 不同执行引擎的区别
  • MySQL 的事务隔离级别
  • MySQL 的可重复读是怎么实现的
  • MySQL 是否会出现幻读
  • MySQL 的 gap 锁
  • MySQL 的主从同步原理
  • 分库分表的实现方案
  • 分布式唯一 ID 方案
  • 如何优化慢查询
  • explain 中每个字段的意思
  • explain 中的 type 字段有哪些常见的值
  • explain 中你通常关注哪些字段,为什么

JVM

  • 运行时数据区
  • 服务器使用的什么垃圾收集器
  • CMS 垃圾收集的原理
  • G1 垃圾收集的特点,为什么低延迟
  • 有哪些垃圾回收算法,优缺点
  • 哪些对象可以作为 GC Roots
  • 有哪些类加载器
  • 双亲委派模式,哪些场景是打破双亲委派模式
  • 线上服务器出现频繁 Full GC,怎么排查
  • 定位问题常用哪些命令
  • 介绍下 JVM 调优的过程

Kafka

  • 为什么使用 Kafka
  • 介绍下 Kafka 的各个组件
  • 如何保证写入 Kafka 的数据不丢失
  • 如何保证从 Kafka 消费的数据不丢失
  • Kafka 为什么性能这么高
  • 零拷贝技术使用哪个方法实现
  • Java 中也有类似的零拷贝技术,是哪个方法
  • Kafka 怎么保证消息的顺序消费
  • Kafka 怎么避免重复消费
  • 什么是 HighWatermark 和 LEO
  • 什么是 ISR,为什么需要引入 ISR

Redis

  • 项目中使用的 Redis 版本
  • Redis 在项目中的使用场景
  • Redis 怎么保证高可用
  • Redis 的选举流程
  • Redis 和 Memcache 的区别
  • Redis 的集群模式
  • Redis 集群要增加分片,槽的迁移怎么保证无损
  • Redis 分布式锁的实现
  • Redis 删除过期键的策略
  • Redis 的内存淘汰策略
  • Redis 的 Hash 对象底层结构
  • Redis 中 Hash 对象的扩容流程
  • Redis 的 Hash 对象的扩容流程在数据量大的时候会有什么问题吗
  • Redis 的持久化机制有哪几种
  • RDB 和 AOF 的实现原理、优缺点
  • AOF 重写的过程
  • 哨兵模式的原理
  • 使用缓存时,先操作数据库还是先操作缓存
  • 为什么是让缓存失效,而不是更新缓存
  • 缓存穿透、缓存击穿、缓存雪崩
  • 更新缓存的几种设计模式

Zookeeper

  • Zookeeper 的使用场景
  • Zookeeper 怎么实现分布式锁
  • Zookeeper 怎么保证数据的一致性
  • ZAB 协议的原理
  • Zookeeper 遵循 CAP 中的哪些
  • Zookeeper 和 Eureka 的区别
  • Zookeeper 的 Leader 选举
  • Observer 的作用
  • Leader 发送了 commit 消息,但是所有的 follower 都没有收到这条消息,Leader 就挂了,后续会怎么处理

分布式

  • CAP 理论
  • BASE 理论
  • 分布式事务 2PC 和 TCC 的原理
  • TCC 在 cancel 阶段如果出现失败怎么处理
  • Paxos 算法、Raft 算法

4、Hr 面

如果你一路过五关斩六将,最终来到了 Hr 面,那么恭喜你,你已经离 offer 非常非常近了。可以开始畅想自己升职加薪,当上总经理,出任 CEO,迎娶白富美,走上人生巅峰的场景了。

Hr 面主要是了解候选人的一些通用素质,经常会问的问题如下:

  • 介绍下自己投入最多的项目(当时我就惊了,Hr 也开始问项目了 )
  • 离职的原因
  • 当前的薪资、绩效
  • 当前在面试的其他公司的情况
  • 平时有没有学习的习惯,怎么学习的,现在在学习什么
  • 未来的规划

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

资料获取方式:戳这里免费下载

当前在面试的其他公司的情况

  • 平时有没有学习的习惯,怎么学习的,现在在学习什么
  • 未来的规划

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

资料获取方式:戳这里免费下载

Java开发框架!java枚举定义lists参数相关推荐

  1. 【Java 基础】枚举、包装类、Math、Radnom、UUID、格式化、DecimalFormat、高精度计算(BigDecimal)

    枚举.包装类.常用类 枚举(Enum) 自定义类实现枚举效果 枚举类型(Enum Type) 枚举的使用注意 包装类(Wrapper Class) 自动装箱.拆箱(Autoboxing and Unb ...

  2. JAVA的枚举定义和使用

    1.什么是枚举用enum修饰是一种特殊的类,但枚举是类,使用枚举可以很方便的定义常量 枚举的概念:枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的 为什么需要枚举: 因为一些方法在运行 ...

  3. java定义一个空数组_一个 Java 方法,最多能定义多少参数?

    点击上方"JAVA",星标公众号重磅干货,第一时间送达 文链接:http://justinblank.com/experiments/howmanytypeparametersca ...

  4. Java 方法的概述-方法的定义-带参数的方法

    方法概述 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集1.方法必须先创建才可以使用,该过程成为方法定义 2.方法创建后并不是直接可以运行的,需要手动使用后才执 ...

  5. java.lang包—枚举类Enum

    原文作者:山高我为 原文地址:java enum的用法详解 目录 一.enum关键字 二.Enum类源码 三.疑问 四.Enum常见用法 一.enum关键字 enum关键字是在Java1.5也就是Ja ...

  6. Java基础笔记 – 枚举类型的使用介绍和静态导入

    Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由 arthinking 发表于404 天前 ⁄ Java基础 ⁄ 暂无评论 ⁄ 被围观 1,433 views+ 1.枚举(Enum): JD ...

  7. Java泛型,枚举,注解

    Java泛型,枚举,注解 1 泛型 1.1 什么是泛型 泛型:即参数化类型.在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型.允许在定义类.接口时通过一个标识表示类中某个属性的 ...

  8. enum java 比较_Kotlin与Java比较:枚举类

    前言 Kotlin作为JVM系的语言,起源于Java又不同于Java.通过在语言层面比较两者的区别,可以使得开发者能够快速学习,融会贯通. 枚举使用场景 使用枚举的场景非常明确,即只要一个类的对象是有 ...

  9. java中的枚举_Java中的枚举

    java中的枚举 Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of const ...

最新文章

  1. PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)
  2. python迷宫小游戏代码_C++课程设计迷宫小游戏
  3. 关于PIC和FPGA
  4. virtualbox mac-debian共享文件夹
  5. html上传视频文件前端显示,文件分片上传之前端文件分片
  6. 一文详解双目立体匹配算法:ELAS
  7. 2020年最新UI设计基础入门教程
  8. python计算累计收益率的函数_大盘及策略收益率的公式推导与Python代码
  9. 网站被劫持的方式,和检测方法、网站被劫持、检测方法有哪些
  10. android 环信录音,环信音视频插件
  11. 【后厂村】打工人的愿望
  12. 计算机网络笔记——概述、物理层、链路层(方老师408课程)
  13. Unity 一分钟学会适配IOS刘海屏
  14. shell softech 面料_户外软壳面料及各品牌的技术
  15. 大数据技术之Hadoop(MapReduce)
  16. Python小项目—照片马赛克
  17. 弘晖资本募集完成人民币三期基金
  18. QT常用布局layout快速入门
  19. python发邮件详解 -- smtplib和email模块
  20. 一个好用的按键驱动模块

热门文章

  1. iTOL美化进化树实战:标签、枝修饰,分组着色
  2. ventory+wtg(vhd)步骤
  3. 程序员月入2万,全部上交给女友,每个月就500的生活费,忍无可忍直接提出分手
  4. python while循环求和_Python基础——for/while循环
  5. 用HTML和CSS做一个携程旅游手机端布局含源码分享
  6. SWEBOK软件工程知识体系 - 13.计算基础
  7. 对《心经》结构的理解
  8. android gpt分区大小,[MTK] 如何确认各个分区起始偏移与大小
  9. 推荐一款好用的浏览器Yandex
  10. 这些数据泄露方式,80%的企业不易发现