✍个人博客:Pandaconda-CSDN博客
📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html
📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
1. 编程语言特性相关(以 Java 为例)
题目: 请解释 Java 中的多态性,并给出一个简单的示例。
答案:
多态性是面向对象编程的一个重要特性,它允许不同的对象对同一消息做出不同的响应。Java 中的多态性主要通过继承和接口实现,具体表现为方法的重写和方法的重载。
以下是一个通过方法重写实现多态性的简单示例:
// 定义一个父类
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
// 定义一个子类
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
// 定义另一个子类
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat meows");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound(); // 输出: Dog barks
animal2.makeSound(); // 输出: Cat meows
}
}
2. 缓存相关
题目: 请解释 Redis 中的缓存穿透、缓存击穿和缓存雪崩,并说明如何解决这些问题。
答案:
缓存穿透:指客户端请求的数据在缓存和数据库中都不存在,这样每次请求都会直接打到数据库上,可能会导致数据库压力过大甚至崩溃。解决方法有:
布隆过滤器:在访问缓存之前,先通过布隆过滤器判断数据是否可能存在,如果不存在则直接返回,避免访问数据库。
缓存空值:当数据库中查询不到数据时,也将空值缓存起来,并设置一个较短的过期时间。
缓存击穿:指某个热点数据在缓存中过期,此时大量请求同时访问该数据,这些请求会直接打到数据库上,导致数据库压力过大。解决方法有:
设置热点数据永不过期:对于一些热点数据,可以不设置过期时间,或者使用后台线程定时更新缓存。
加互斥锁:当发现缓存过期时,先获取一个互斥锁,只有获取到锁的线程才能去数据库查询数据并更新缓存,其他线程等待缓存更新完成后再从缓存中获取数据。
缓存雪崩:指大量缓存数据在同一时间过期,导致大量请求直接打到数据库上,引起数据库压力过大甚至崩溃。解决方法有:
设置随机过期时间:为不同的缓存数据设置不同的过期时间,避免大量数据同时过期。
使用多级缓存:例如同时使用 Redis 和本地缓存,当 Redis 缓存失效时,可以先从本地缓存中获取数据。限流和降级:在缓存雪崩发生时,对请求进行限流,或者对一些非核心业务进行降级处理,保证数据库的稳定运行。
3. 系统设计相关
题目: 设计一个简单的短链接服务系统,说明其主要组成部分和工作流程。
答案:
主要组成部分
- URL 存储数据库:用于存储原始 URL 和对应的短链接信息,通常使用关系型数据库(如 MySQL)或非关系型数据库(如 Redis)。
- 短链接生成器:负责将原始 URL 转换为短链接,一般使用哈希算法或自增 ID 结合 Base62 编码等方式生成短链接。
- Web 服务器:接收用户的请求,处理短链接的生成和跳转逻辑。
- 缓存系统:用于缓存短链接和原始 URL 的映射关系,提高系统的响应速度。
工作流程
- 生成短链接:用户提交原始 URL 到 Web 服务器,Web 服务器调用短链接生成器生成一个唯一的短链接,并将原始 URL 和短链接的映射关系存储到 URL 存储数据库中,同时将映射关系缓存到缓存系统中。
- 短链接跳转:当用户访问短链接时,Web 服务器首先从缓存系统中查找对应的原始 URL,如果找到则直接重定向到原始 URL;如果缓存中不存在,则从 URL 存储数据库中查找,找到后将结果返回给用户并更新缓存系统。如果数据库中也不存在该短链接,则返回错误信息。