这里写目录标题
- 一、【微服务】redis可以存储哪几种数据类型? 你的项目里都用redis存储哪些数据?
- 二、【微服务】redis都用在哪些方面了?怎么用的?
- 三、【微服务】redis有哪些常用操作?
- 四、【微服务】Redis缓存和数据库怎么保持一致?
- 五、【微服务】redis可以持久化么?如何持久化?
- 六、【微服务】redis分布式锁怎么使用?
- 七、【微服务】redis缓存数据丢失怎么办?
- 八、【微服务】redis如果崩溃了如何快速恢复?
- 九、【微服务】redis是如何部署的? 是单个部署还是集群部署?为什么这么做?
- 十、【微服务】什么是缓存穿透、缓存击穿、缓存雪崩? 如何解决?
- 十一、【微服务】springcloud组件都有哪些?
- 十二、【微服务】分布式事务是怎么处理的?
- 十三、【微服务】SpringCloud和Dubbo的区别? dubbo和springcloud是怎么集成的?
- 十四、【微服务】rabbit mq在项目中是怎么使用的?
- 十五、【微服务】rabbit mq的应用场景及4种转发模式?
- 十六、【微服务】点对点模式和订阅模式。如何进行持久化?
- 十七、【微服务】你的项目中使用到了Shiro怎么用的? 登录的具体怎么做的?
- 十八、【微服务】eureka怎么配置?
- 十九、【设计模式】说说你都知道哪些设计模式? 最常用的有哪些?总共有几种设计模式?
- 二十、【设计模式】 spring运用了什么设计模式?讲一下哪些部分用到了这些设计模式
- 二十一、【设计模式】你使用过单例模式吗? 请把单例模式写下来。springboot如何创建单例?
- 二十二、【设计模式】如何保证单例模式在多线程中的线程安全性?
- 二十三、【设计模式】懒汉和饿汉模式的区别? 手写两种模式
- 二十四、【反射】java的反射机制?
- 二十五、【反射】反射怎么获取类中的所有方法和获取类中的所有属性?
- 二十六、【反射】class.forName和 ClassLoader的区别?
- 二十七、【JVM】堆和栈的区别?
- 二十八、【JVM】JVM调优的方法?
- 二十九、【JVM】垃圾回收机制?
- 三十、【JVM】JVM内存结构?
一、【微服务】redis可以存储哪几种数据类型? 你的项目里都用redis存储哪些数据?
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset (sorted set:有序集合)
可以允许丢失的数据都可以使用redis做存储方案,例如session、缓存、队列数据、临时中转数据、等等
二、【微服务】redis都用在哪些方面了?怎么用的?
Redis 九大使用场景:
- 热点数据的缓存
- 限时业务的运用
- 计数器相关问题
- 排行榜相关问题
- 分布式锁
- 延时操作
- 分页、模糊搜索
- 点赞、好友等相互关系的存储
- 队列
三、【微服务】redis有哪些常用操作?
redis常用命令有:1、连接操作命令;2、持久化命令;3、远程服务控制命令;4、对value操作命令;5、string命令;6、list命令;7、set命令;8、hash命令等等。
- 字符串:对单个字符串进行读写操作,例如:SET、GET、INCR 等。
- 列表:对列表类型数据进行读写操作,例如:LPUSH、RPUSH、LINDEX 等。
- 集合:对集合类型数据进行读写操作,例如:SADD、SISMEMBER、SMEMBERS 等。
- 哈希:对哈希类型数据进行读写操作,例如:HSET、HGET、HGETALL 等。
- 有序集合:对带有分数的集合进行读写操作,例如:ZADD、ZRANGE、ZCOUNT 等。
四、【微服务】Redis缓存和数据库怎么保持一致?
- 更新的时候,先删除缓存,然后再更新数据库。
- 读的时候,先读缓存;如果没有的话,就读数据库,同时将数据放入缓存,并返回响应。
五、【微服务】redis可以持久化么?如何持久化?
redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化
redis提供两种持久化机制:分别是 RDB (Redis DataBase)和 AOF (Append Only File)。
-
RDB
默认方式,是将 redis 某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。(把数据做一个备份,将数据存储到文件) -
AOF
AOF持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。
六、【微服务】redis分布式锁怎么使用?
理解分布式锁
分布式锁其实就是,控制分布式系统 不同进程 共同访问 共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。
Redis 的 SET 命令有个 NX 参数可以实现「key不存再才插入」,所以可以用它来实现分布式锁:
- 如果 key 不存在,则显示插入成功,可以用来表示加锁成功;
- 如果 key 存在,则会显示插入失败,可以用来表示加锁失败。
七、【微服务】redis缓存数据丢失怎么办?
- 如果只配置AOF,重启时加载AOF文件恢复数据;
- 如果同时 配置了RDB和AOF,启动时只加载AOF文件恢复数据;
- 如果只配置RDB,启动时将加载dump文件恢复数据。
八、【微服务】redis如果崩溃了如何快速恢复?
- 使用 Redis 持久化:在 Redis 配置文件中启用持久化功能,可以将内存中的数据保存到硬盘上,在 Redis 崩溃后通过重新加载数据快速恢复。
- 使用 Redis Sentinel:Redis Sentinel 是一种高可用方案,可以监控 Redis 服务器并自动将主服务器故障转移到从服务器上。如果主服务器崩溃了,Redis Sentinel 会将从服务器提升为主服务器,并且不会丢失任何数据。
- 使用 Redis Cluster:Redis Cluster 是 Redis 的分布式版本,可以在多个节点之间进行数据分片,可以保证高可用性和数据冗余。如果某个节点崩溃了,Redis Cluster 可以自动将该节点上的数据转移到其他节点上,从而实现快速恢复。
九、【微服务】redis是如何部署的? 是单个部署还是集群部署?为什么这么做?
redis 有4种部署方式:单机,主从,哨兵,集群
单节点部署:
适用于数据量较小、对数据安全性要求不高的场景,但是随着数据量的增加,单节点的存储容量、处理能力也会受到限制。
集群部署:
可以通过分片将数据分布在多个Redis节点上,提高存储容量和处理能力,同时通过Redis Cluster实现数据的可用性和自动数据分片,保证数据的安全性和可用性。
因此,选择哪种方式部署Redis,需要根据实际的业务需求和数据特点来决定。
十、【微服务】什么是缓存穿透、缓存击穿、缓存雪崩? 如何解决?
缓存穿透
指的是请求一个不存在的数据,这个数据在缓存中没有缓存,因此每次请求都会被直接转发到后端数据库,造成大量的无效请求和压力。
对于不存在的数据可以将一个空对象放入缓存,或者设置布隆过滤器,预先判断请求的数据是否存在。
缓存击穿
指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
可以使用分布式锁或者缓存的双重缓存机制,防止在缓存数据失效的情况下大量请求直接被转发到后端数据库。
缓存雪崩
指缓存中数据大批量到过期时间,而查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
可以通过缓存数据的设置不同的失效时间,避免同一时间所有的数据都失效;或者使用缓存的自动分片技术,将缓存数据分散到多个节点上,防止单个节点的失效导致整个缓存雪崩。
十一、【微服务】springcloud组件都有哪些?
SpringCloud包含的组件很多,有很多功能是重复的。其中最常用组件包括:
- 注册中心组件:Eureka、Nacos等
- 负载均衡组件:Ribbon
- 远程调用组件:OpenFeign
- 网关组件:Zuul、Gateway
- 服务保护组件:Hystrix、Sentinel
- 服务配置管理组件:SpringCloudConfig、Nacos
十二、【微服务】分布式事务是怎么处理的?
利用事务的隔离性和一致性来保证数据的完整
首先,各个节点都会接收到事务的提交请求;然后,各个节点都会对事务进行验证,如果事务有问题,则会拒绝提交;最后,各个节点会同步事务的提交结果。
十三、【微服务】SpringCloud和Dubbo的区别? dubbo和springcloud是怎么集成的?
- 初始定位不同:
- SpringCloud定位为微服务架构下的一站式解决方案;
- Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理
- 生态环境不同:
- SpringCloud依托于Spring平台,具备更加完善的生态体系;
- 而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。
- 调用方式不同:
- SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;
- Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。
- 组件差异比较多:
- 例如SpringCloud注册中心一般用Eureka(有瑞噶),而Dubbo用的是Zookeeper(肉 k per)。
- SpringCloud生态丰富,功能完善,更像是品牌机。
- Dubbo则相对灵活,可定制性强,更像是组装机。
dubbo和springcloud集成:
- 编写公共dubbo-api
- 导入相关依赖
- 配置application.yml文件
十四、【微服务】rabbit mq在项目中是怎么使用的?
RabbitMQ就是一个消息队列,可以用来在不同的程序之间传递数据,在项目中,我们可以使用RabbitMQ来处理异步通信。它可以帮助我们在不同的程序之间传递数据,而无需等待其他程序的响应。 RabbitMQ还可以用于定期推送数据或消息给客户端。
十五、【微服务】rabbit mq的应用场景及4种转发模式?
应用场景:
- 分布式系统的消息传递:可以用来在分布式系统中传递消息,从而实现系统之间的解耦。
- 消息队列:可以用来构建消息队列,从而实现消息的异步处理。
- 消息路由:可以用来实现消息的路由,从而实现消息的灵活转发。
- 消息通知:可以用来实现消息的发布/订阅,从而实现消息的实时通知。
转发模式:
- Direct(的ruai课他) Exchange(咦课四沉只):Direct Exchange是RabbitMQ中最简单的转发模式,它将消息路由到那些Binding Key与Routing Key完全匹配的Queue中。
- Fanout Exchange:Fanout Exchange是RabbitMQ中最快的转发模式,它将消息路由到所有与它绑定的Queue中。
- Topic Exchange:Topic Exchange是RabbitMQ中最灵活的转发模式,它将消息路由到那些Binding Key与Routing Key模式匹配的Queue中。
- Headers Exchange:Headers Exchange是RabbitMQ中最复杂的转发模式,它将消息路由到那些Binding Argument(啊跟门他)与Message Header完全匹配的Queue中。
十六、【微服务】点对点模式和订阅模式。如何进行持久化?
十七、【微服务】你的项目中使用到了Shiro怎么用的? 登录的具体怎么做的?
在使用Shiro(西肉)进行登录时,需要配置认证器、授权器等组件,以实现对用户登录信息的认证和授权
Shiro 的登陆流程:
- 用户登录,提交用户名和密码。
- 系统对用户提交的信息进行认证。
- 如果用户认证通过,系统创建并维护用户的会话,并将用户的相关信息存储在会话中。
- 如果用户认证失败,系统返回登录失败的信息,要求用户重新登录。
十八、【微服务】eureka怎么配置?
- 添加依赖:在pom.xml文件中添加Eureka Server相关依赖:
1 <dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
4 </dependency>
- 启用Eureka Server:在启动类上添加@EnableEurekaServer注解:
1 @EnableEurekaServer
2 @SpringBootApplication
3 public class EurekaServerApplication {
4 public static void main(String[] args) {
5 SpringApplication.run(EurekaServerApplication.class, args);
6 }
7 }
- 配置Eureka Server:在application.properties或application.yml文件中配置Eureka Server相关配置信息:
1 server.port=8761
2
3 eureka.instance.hostname=localhost
4 eureka.client.register-with-eureka=false
5 eureka.client.fetch-registry=false
十九、【设计模式】说说你都知道哪些设计模式? 最常用的有哪些?总共有几种设计模式?
设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式。
常用的设计模式有:
- 单例模式(懒汉式、饿汉式)
- 工厂模式
- 代理模式
二十、【设计模式】 spring运用了什么设计模式?讲一下哪些部分用到了这些设计模式
- 工厂模式
- 单列模式
- 代理模式
- 模板方法模式
- 观察者模式
- 适配器模式
- 装饰者模式
- 策略模式
二十一、【设计模式】你使用过单例模式吗? 请把单例模式写下来。springboot如何创建单例?
单例模式有5种:
- 懒汉式
- 饿汉式
- 双检锁/双重校验锁(DCL,即 double-checked locking)
- 登记式/静态内部类
- 枚举
springboot如何创建单例:
使用集成 service
因为是单例模式,所以需要spring上下文注入进来,才能获取到
二十二、【设计模式】如何保证单例模式在多线程中的线程安全性?
- 立即加载(饿汉模式)
- 延迟加载(懒汉模式)
- 延迟加载中使用synchronized修饰方法
- 延迟加载中使用同步代码块,对类加锁
- 使用DCL双检查锁机制
- 使用静态内置类实现单例模式
- 序列化与反序列化的单例模式
- 使用static代码块实现单例模式
二十三、【设计模式】懒汉和饿汉模式的区别? 手写两种模式
- 内存使用
饿汉式在一开始类加载的时候就实例化,无论使用与否,都会实例化,所以会占据空间,浪费内存;
懒汉式什么时候用就什么时候实例化,不浪费内存。 - 线程安全
饿汉式在线程还没出现之前就已经实例化了,所以饿汉式一定是线程安全的。
懒汉式一般使用都会加synchronized
同步锁实现线程安全
懒汉式加载是在使用时才会去new 实例的,那么你去new的时候是一个动态的过程,是放到方法中实现的,如果这个时候有多个线程访问这个实例,这个时候实例还不存在,还在new,就会进入到方法中,有多少线程就会new出多少个实例。一个方法只能return一个实例,那最终return出哪个呢?这种情况当然也可以解决,那就是加同步锁,避免这种情况发生 。
- 执行效率
饿汉式没有加任何的锁,因此执行效率比较高;
懒汉式一般使用都会加同步锁,效率比饿汉式差。
懒汉式代码实现
public class Singleton {
//默认不会实例化,什么时候用就什么时候new
private static Singleton instance = null;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null){
//什么时候用就什么时候new
instance = new Singleton();
}
return instance;
}
}
饿汉模式代码实现:
public class Singleton {
//一开始类加载的时候就实例化,创建单实例对象
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
二十四、【反射】java的反射机制?
Java的反射(reflection)机制是指在程序的运行状态中,
可以构造任意一个类的对象,
可以了解任意一个对象所属的类,
可以了解任意一个类的成员变量和方法,
可以调用任意一个对象的属性和方法。
这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。
二十五、【反射】反射怎么获取类中的所有方法和获取类中的所有属性?
可以通过 Class 类的方法获取类的所有属性和方法:
获取该类所有属性:java.lang.Class#getDeclaredFields)(迪克来儿的)
获取该类所有方法:java.lang.Class#getDeclaredMethods
二十六、【反射】class.forName和 ClassLoader的区别?
在java中Class.forName()和ClassLoader都可以对类进行加载。
(1)class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。当然还可以指定是否执行静态块。
(2)classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
二十七、【JVM】堆和栈的区别?
- 堆是运行时确定内存大小,而栈在编译时即可确定内存大小
- 堆内存由用户管理(Java中由JVM管理),栈内存会被自动释放
- 栈实现方式采用数据结构中的栈实现,具有(LIFO)的顺序特点,堆为一块一块的内存
- 栈由于其实现方式,在分配速度上比堆快的多。分配一块栈内存不过是简单的移动一个指针
- 在JVM中,栈不会被程序员直接使用,程序员操作的一般都是堆。
- 栈为线程私有而堆为线程共享
二十八、【JVM】JVM调优的方法?
- 将新对象预留在新生代
- 大对象进入老年代
- 设置对象进入老年代的年龄
- 稳定与震荡的堆大小
- 吞吐量优先设置
- 使用大页案例
- 降低停顿案例
二十九、【JVM】垃圾回收机制?
在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。
三十、【JVM】JVM内存结构?
Java 运行时内存划分:
线程私有:
- 虚拟机栈
- 本地方法栈
- 程序计数器
线程共享:
- 堆区
- 方法区