基础
字段基础
标识符和关键字
Go语言中有25个关键字:
12345break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return var
此外,Go语言中还有37个保留字。
12345678910Constants: true false iota nil Types: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr ...
Nacos
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
服务发现
RestTemplate服务调用:
在定义RestTemplate的时候,增加了@LoadBalanced注解,而在真正调用服务接口的时候,直接采用服务名的时候来写请求路径即可。在真正调用的时候,Spring Cloud会将请求拦截下来,然后通过负载均衡器选出节点,并替换服务名部分为具体的ip和端口,从而实现基于服务名的负载均衡调用。
Feign服务调用:
主要先通过@EnableFeignClients注解开启扫描Spring Cloud Feign客户端的功能;然后又创建一个Feign的客户端接口定义。使用@FeignClient注解来指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口,比如下面就是 ...
入门
核心概念
节点 (Node): 代表实体,就像关系型数据库中的一行数据。例如:一个人、一部电影、一个公司。节点可以有标签 (Label) 来分类,比如 :Person, :Movie。
关系 (Relationship): 代表节点之间的连接,这是图数据库的精髓。例如:[:ACTED_IN] (出演), [:DIRECTED] (导演)。关系必须有方向和类型。
属性 (Property): 节点和关系都可以有属性,用来存储键值对数据。例如:一个 :Person 节点可以有 name: 'Keanu Reeves' 属性。
语句:
MERGE: 一个非常强大的命令,可以理解为 “匹配或创建”。如果节点/关系已存在,就匹配它;如果不存在,就创建它。常用来避免创建重复数据。
WHERE: 过滤条件,用法和 SQL 非常相似。
SET: 修改节点或关系的属性。
DELETE / DETACH DELETE: 删除节点和关系。DETACH DELETE 会在删除节点的同时,删除与它相连的所有关系。
可变长度路径: 查询两个节点之间任意长度的路径,例如 (a)-[ ...
Spring AI Alibaba Graph
旨在利用 Spring AI 作为桥梁,连接阿里巴巴的大语言模型(如通义千wen)和图数据库(如阿里云 GDB),以实现通过自然语言与复杂关联数据进行交互的目的。
底层核心原理是 Text-to-Cypher/Gremlin,即将用户的自然语言问题,通过大语言模型(LLM)动态翻译成图数据库的专业查询语言。
设计思想
图数据库(Graph Database)非常擅长处理实体之间的复杂关系,例如社交网络中的“朋友的朋友”、金融风控中的“资金链路”、电商中的“共同购买”等。但要查询这些数据,需要使用专门的图查询语言,如 Gremlin (阿里云 GDB 支持) 或 Cypher。这些语言学习门槛高,普通业务人员无法直接使用。
“Spring AI Alibaba Graph”架构的核心思想就是解决这个问题:让 LLM 充当一个智能的“翻译官”。
流程:
赋予 LLM 上下文知识 (Context Awareness):一个通用的 LLM 不知道你的图数据库里有什么。因此,必须在查询时,动态地告诉 LLM 图的**“Schema”**(模式), ...
设计
分层架构
Dubbo 最显著的特点就是其分层架构。官方文档中将其划分为 10 层,但为了便于理解,我们可以将其归纳为三大块:业务层、RPC 核心层、Remoting 通信层。
业务层 (Business Layer):
Service 层: 开发者定义的业务接口和实现。
Config 层: 对外配置层,用于配置服务的暴露和引用,如 ServiceConfig 和 ReferenceConfig。这是开发者直接接触的部分。
RPC 核心层 (RPC Core Layer): 这是 Dubbo 功能的核心所在。
Proxy 层: 服务代理层。为消费者端生成接口的代理对象,使其能像调用本地方法一样调用远程服务。
Registry 层: 注册中心层。负责服务的注册与发现,封装了与 Zookeeper、Nacos 等注册中心的交互。
Cluster 层: 集群容错层。当从注册中心获取到多个服务提供者时,由该层决定如何选择(负载均衡)以及在调用失败时如何应对(容错机制)。
Monitor 层: 监控层。负责统计服务的调用次数、耗时等信息。
Protocol 层: 远程调用层。这是 RP ...
分布式
1.介绍一下CAP理论
CAP 原则又称 CAP 定理, 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性), 三者不可得兼
一致性© : 在分布式系统中的所有数据备份, 在同一时刻是否同样的值(等同于所有节点访问同一份最新的数据副本)
可用性(A): 在集群中一部分节点故障后, 集群整体是否还能响应客户端的读写请求(对数据更新具备高可用性)
分区容忍性(P): 以实际效果而言, 分区相当于对通信的时限要求. 系统如果不能在时限内达成数据一致性, 就意味着发生了分区的情况, 必须就当前操作在 C 和 A 之间做出选择
2.如何使用redis分布式锁
分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。
Redis 本身可以被多个客户端共享访问,正好就是一个共享存储系统,可以用来保存分布式锁,而且 Redis 的读写性能高,可以应对高并发的锁操作场景。Redis 的 SET 命令有个 NX 参数可以实现「key不存在才插入」,所以可以 ...
技术栈
未读IOC
BeanDefinition
BeanDefinition 是 Spring IoC 容器的基石,它是 Bean 的一切元数据(类名、作用域、构造函数参数、属性等)的载体,是面向接口编程思想的体现。容器操作的是 BeanDefinition,而非直接操作 Class。
我们最常用的就是DefaultListableBeanFactory 中 beanDefinitionMap 这个 ConcurrentHashMap,所有加载的 BeanDefinition 都存储于此。
然后我们的IOC容器ApplicationContext 根据其实现(XML, Annotation)选择不同的策略(Reader, Scanner)来加载 BeanDefinition。模板方法模式在 AbstractBeanDefinitionReader 等类中被广泛使用。
XML 路径: 从 AbstractXmlApplicationContext 的构造函数出发 -> loadBeanDefinitions(new XmlBeanDefinitionReader(this)) -> X ...
美团
一面
题目1
请说明进程和线程的区别与联系。操作系统中的虚拟内存是如何实现的?谈谈乐观锁和悲观锁,以及它们在Java中的具体实现(如CAS、Synchronized)。AQS(AbstractQueuedSynchronizer)的原理是什么?请举例说明(如ReentrantLock)。当向一个线程池提交任务时,它的执行流程是怎样的?(考虑核心线程、队列、最大线程、拒绝策略)
介绍一下Redis的持久化机制有哪几种,它们各自有什么优缺点?如何保证缓存与数据库双写一致性?谈谈MySQL的事务隔离级别,以及MVCC是如何在可重复读(RR)级别下工作的。什么是覆盖索引和回表?在使用联合索引时,需要注意哪些最左前缀匹配原则?
请描述一下JVM的类加载过程,以及双亲委派模型。G1垃圾收集器相比于CMS有哪些优势?什么情况下会发生OOM(堆内存溢出),请举例说明几种场景。Java中的强引用、软引用、弱引用、虚引用之间有什么区别?
题目2
1:自我介绍
2:HashMap1.8底层数据结构和put流程
3:jvm底层和OOM发生区域
4:roc调用流程
5:慢SQL调查流程
6:mysql隔离 ...
线程
1.从 JVM 的角度来说一下线程和进程之间的关系
一个进程中可以有多个线程,多个线程共享进程的堆和**方法区 (JDK1.8 之后的元空间)*资源,但是每个线程有自己的*程序计数器、虚拟机栈 和 本地方法栈。
线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
那么?为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢?为什么堆和方法区是线程共享的呢?
程序计数器:
主要作用:字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。
so,程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。
虚拟机栈和本地方法栈
...
索引
1.索引的分类
从数据结构上分类,B+树索引,hash索引,倒排索引,R树索引
从InoDB的B+树的索引分类,分为聚簇索引和非聚簇索引
从索引的性质进行分类,普通索引,主键索引,唯一索引,联合索引,全文索引,空间索引
锁&隔离级别
1.表级锁与行级锁的区别?
MySQL 常见的两种锁是表级锁和行级锁。
表级锁锁定整个表,所有对该表的读写操作都会被阻塞,适用于低并发场景;而行级锁锁定特定行,允许其他行的操作并发进行,适用于高并发场景。
表级锁粒度大,加锁快、开销小,但并发性能差,典型代表是 MyISAM。
行级锁粒度小,允许多个事务并发操作不同的行,并发性高,但锁的开销大,容易出现死锁,典型代表是 InnoDB。
因此实际使用时,MyISAM 适合读多写少的分析场景,而 InnoDB 的行级锁更适合高并发的 OLTP 系统。
2.MySQL 默认隔离级别?为何选择它?
MySQL 的默认隔离级别是可重复读(REPEATABLE READ)。选择这一隔离级别是因为它能够提供较高的数据一致性,防止不可重复读,并通过 MVCC(多版本并发控制)技术支持高效的并发性能。同时,通过 ...
Spring框架
1.SpringBoot的配置加载优先级
首先我们先确定一下配置加载优先级是按照我以下的顺序,由高到低的。分别是:
先是命令行参数(--server.port=9000 或 java -jar app.jar --spring.config.location=...)
然后是我们的系统的环境变量和JVM系统属性,比如设置端口为8080,比如我们在这里设置API的KEY
然后**RandomValuePropertySource**(random.* 占位符,用于生成随机数/字符串,可在配置中引用)
接着是外部配置文件(properties / yml)
JAR 包外部的 ./config/
JAR 包外部的 ./
JAR 包内部的 classpath:/config/
JAR 包内部的 classpath:/
接着是我们@PropertySource注解指定的配置
最后是我们Springboot默认的配置
然后在配置文件中,properties的配置大于yml,因为springboot是按加载顺序来的,后加载的prope ...













