面试题第四部分

这里写目录标题

一、【微服务】redis可以存储哪几种数据类型? 你的项目里都用redis存储哪些数据?

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset (sorted set:有序集合)

可以允许丢失的数据都可以使用redis做存储方案,例如session、缓存、队列数据、临时中转数据、等等

二、【微服务】redis都用在哪些方面了?怎么用的?

Redis 九大使用场景:

  1. 热点数据的缓存
  2. 限时业务的运用
  3. 计数器相关问题
  4. 排行榜相关问题
  5. 分布式锁
  6. 延时操作
  7. 分页、模糊搜索
  8. 点赞、好友等相互关系的存储
  9. 队列

三、【微服务】redis有哪些常用操作?

redis常用命令有:1、连接操作命令;2、持久化命令;3、远程服务控制命令;4、对value操作命令;5、string命令;6、list命令;7、set命令;8、hash命令等等。

  1. 字符串:对单个字符串进行读写操作,例如:SET、GET、INCR 等。
  2. 列表:对列表类型数据进行读写操作,例如:LPUSH、RPUSH、LINDEX 等。
  3. 集合:对集合类型数据进行读写操作,例如:SADD、SISMEMBER、SMEMBERS 等。
  4. 哈希:对哈希类型数据进行读写操作,例如:HSET、HGET、HGETALL 等。
  5. 有序集合:对带有分数的集合进行读写操作,例如: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如果崩溃了如何快速恢复?

  1. 使用 Redis 持久化:在 Redis 配置文件中启用持久化功能,可以将内存中的数据保存到硬盘上,在 Redis 崩溃后通过重新加载数据快速恢复。
  2. 使用 Redis Sentinel:Redis Sentinel 是一种高可用方案,可以监控 Redis 服务器并自动将主服务器故障转移到从服务器上。如果主服务器崩溃了,Redis Sentinel 会将从服务器提升为主服务器,并且不会丢失任何数据。
  3. 使用 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是怎么集成的?

  1. 初始定位不同:
  • SpringCloud定位为微服务架构下的一站式解决方案;
  • Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理
  1. 生态环境不同:
  • SpringCloud依托于Spring平台,具备更加完善的生态体系;
  • 而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。
  1. 调用方式不同:
  • SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;
  • Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。
  1. 组件差异比较多:
  • 例如SpringCloud注册中心一般用Eureka(有瑞噶),而Dubbo用的是Zookeeper(肉 k per)。
  • SpringCloud生态丰富,功能完善,更像是品牌机。
  • Dubbo则相对灵活,可定制性强,更像是组装机。

dubbo和springcloud集成:

  1. 编写公共dubbo-api
  2. 导入相关依赖
  3. 配置application.yml文件

十四、【微服务】rabbit mq在项目中是怎么使用的?

RabbitMQ就是一个消息队列,可以用来在不同的程序之间传递数据,在项目中,我们可以使用RabbitMQ来处理异步通信。它可以帮助我们在不同的程序之间传递数据,而无需等待其他程序的响应。 RabbitMQ还可以用于定期推送数据或消息给客户端。

十五、【微服务】rabbit mq的应用场景及4种转发模式?

应用场景:

  1. 分布式系统的消息传递:可以用来在分布式系统中传递消息,从而实现系统之间的解耦。
  2. 消息队列:可以用来构建消息队列,从而实现消息的异步处理。
  3. 消息路由:可以用来实现消息的路由,从而实现消息的灵活转发。
  4. 消息通知:可以用来实现消息的发布/订阅,从而实现消息的实时通知。

转发模式:

  1. Direct(的ruai课他) Exchange(咦课四沉只):Direct Exchange是RabbitMQ中最简单的转发模式,它将消息路由到那些Binding Key与Routing Key完全匹配的Queue中。
  2. Fanout Exchange:Fanout Exchange是RabbitMQ中最快的转发模式,它将消息路由到所有与它绑定的Queue中。
  3. Topic Exchange:Topic Exchange是RabbitMQ中最灵活的转发模式,它将消息路由到那些Binding Key与Routing Key模式匹配的Queue中。
  4. Headers Exchange:Headers Exchange是RabbitMQ中最复杂的转发模式,它将消息路由到那些Binding Argument(啊跟门他)与Message Header完全匹配的Queue中。

十六、【微服务】点对点模式和订阅模式。如何进行持久化?

十七、【微服务】你的项目中使用到了Shiro怎么用的? 登录的具体怎么做的?

在使用Shiro(西肉)进行登录时,需要配置认证器、授权器等组件,以实现对用户登录信息的认证和授权

Shiro 的登陆流程:

  1. 用户登录,提交用户名和密码。
  2. 系统对用户提交的信息进行认证。
  3. 如果用户认证通过,系统创建并维护用户的会话,并将用户的相关信息存储在会话中。
  4. 如果用户认证失败,系统返回登录失败的信息,要求用户重新登录。

十八、【微服务】eureka怎么配置?

  1. 添加依赖:在pom.xml文件中添加Eureka Server相关依赖:
1  <dependency>
2      <groupId>org.springframework.cloud</groupId>
3      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
4  </dependency>
  1. 启用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  }
  1. 配置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 )和行为型模式。

常用的设计模式有:

  1. 单例模式(懒汉式、饿汉式)
  2. 工厂模式
  3. 代理模式

二十、【设计模式】 spring运用了什么设计模式?讲一下哪些部分用到了这些设计模式

  • 工厂模式
  • 单列模式
  • 代理模式
  • 模板方法模式
  • 观察者模式
  • 适配器模式
  • 装饰者模式
  • 策略模式

二十一、【设计模式】你使用过单例模式吗? 请把单例模式写下来。springboot如何创建单例?

单例模式有5种:

  1. 懒汉式
  2. 饿汉式
  3. 双检锁/双重校验锁(DCL,即 double-checked locking)
  4. 登记式/静态内部类
  5. 枚举

springboot如何创建单例:
使用集成 service
因为是单例模式,所以需要spring上下文注入进来,才能获取到

二十二、【设计模式】如何保证单例模式在多线程中的线程安全性?

  1. 立即加载(饿汉模式)
  2. 延迟加载(懒汉模式)
  3. 延迟加载中使用synchronized修饰方法
  4. 延迟加载中使用同步代码块,对类加锁
  5. 使用DCL双检查锁机制
  6. 使用静态内置类实现单例模式
  7. 序列化与反序列化的单例模式
  8. 使用static代码块实现单例模式

二十三、【设计模式】懒汉和饿汉模式的区别? 手写两种模式

  1. 内存使用
    饿汉式在一开始类加载的时候就实例化,无论使用与否,都会实例化,所以会占据空间,浪费内存;
    懒汉式什么时候用就什么时候实例化,不浪费内存。
  2. 线程安全
    饿汉式在线程还没出现之前就已经实例化了,所以饿汉式一定是线程安全的。
    懒汉式一般使用都会加 synchronized 同步锁实现线程安全

懒汉式加载是在使用时才会去new 实例的,那么你去new的时候是一个动态的过程,是放到方法中实现的,如果这个时候有多个线程访问这个实例,这个时候实例还不存在,还在new,就会进入到方法中,有多少线程就会new出多少个实例。一个方法只能return一个实例,那最终return出哪个呢?这种情况当然也可以解决,那就是加同步锁,避免这种情况发生 。

  1. 执行效率
    饿汉式没有加任何的锁,因此执行效率比较高;
    懒汉式一般使用都会加同步锁,效率比饿汉式差。

懒汉式代码实现

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】堆和栈的区别?

  1. 堆是运行时确定内存大小,而栈在编译时即可确定内存大小
  2. 堆内存由用户管理(Java中由JVM管理),栈内存会被自动释放
  3. 栈实现方式采用数据结构中的栈实现,具有(LIFO)的顺序特点,堆为一块一块的内存
  4. 栈由于其实现方式,在分配速度上比堆快的多。分配一块栈内存不过是简单的移动一个指针
  5. 在JVM中,栈不会被程序员直接使用,程序员操作的一般都是堆。
  6. 栈为线程私有而堆为线程共享

二十八、【JVM】JVM调优的方法?

  1. 将新对象预留在新生代
  2. 大对象进入老年代
  3. 设置对象进入老年代的年龄
  4. 稳定与震荡的堆大小
  5. 吞吐量优先设置
  6. 使用大页案例
  7. 降低停顿案例

二十九、【JVM】垃圾回收机制?

在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

三十、【JVM】JVM内存结构?

Java 运行时内存划分:
线程私有:

  1. 虚拟机栈
  2. 本地方法栈
  3. 程序计数器

线程共享:

  1. 堆区
  2. 方法区
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值