目录
1.Redis
编辑编辑
缓存穿透:
编辑编辑
缓存击穿:
缓存雪崩:
双写一致性问题:编辑
一致性要求高的业务:
允许短暂的不一致
Redis数据的持久化问题:
编辑Redis的数据过期策略:
Redis的数据淘汰策略:
MySQL
1.如何去定位慢查询?
SQL语句执行很慢,如何分析?
索引的概念以及索引底层的数据结构
编辑编辑什么聚簇索引,什么是二级索引(非聚集索引)? 编辑编辑编辑
覆盖索引和超大分页
索引创建的原则有哪些?
什么是联合索引?
联合索引的结构
创建联合索引
联合索引的使用场景
联合索引的注意事项
示例
总结
什么情况下索引会失效?
谈一谈你对SQL优化的经验
Spring
Spring框架下的单例Bean是线程安全的吗?
编辑
什么是AOP,你在项目中是否使用过AOP?
Spring中事务是如何实现的?
Spring中事务失效的场景有哪些?编辑
Spring中什么是动态代理?什么是代理
1. 代理(Proxy)
2. 动态代理(Dynamic Proxy)
1. 基于接口的动态代理(JDK 动态代理)
2. 基于类的动态代理(CGLIB 动态代理)
总结
mybatis的执行流程
1.Redis
缓存穿透:
误判:
缓存击穿:
缓存雪崩:
双写一致性问题:
一致性要求高的业务:
出现脏数据:
如何保证强一致性:
允许短暂的不一致
Redis数据的持久化问题:
rdb的执行原理:
Redis的数据过期策略:
Redis的数据淘汰策略:
MySQL
1.如何去定位慢查询?
SQL语句执行很慢,如何分析?
索引的概念以及索引底层的数据结构
B树
B+树

什么聚簇索引,什么是二级索引(非聚集索引)? 


覆盖索引和超大分页
索引创建的原则有哪些?
什么是联合索引?
联合索引(Composite Index)是数据库中的一种索引类型,它基于表中的多个列创建。与单列索引(基于单个列创建的索引)不同,联合索引可以同时对多个列进行索引,从而提高多列查询的性能。
联合索引的结构
联合索引的结构类似于单列索引,但它将多个列的值组合在一起形成一个索引键。数据库会按照这些列的顺序对数据进行排序和索引。例如,假设有一个表 orders
,包含以下列:
-
order_id
-
customer_id
-
order_date
如果创建了一个联合索引 (customer_id, order_date)
,那么数据库会按照 customer_id
和 order_date
的组合对数据进行排序和索引。
创建联合索引
在 SQL 中,可以通过以下语法创建联合索引:
sql复制
CREATE INDEX idx_customer_order_date
ON orders (customer_id, order_date);
这个索引会按照 customer_id
和 order_date
的组合对数据进行排序和索引。
联合索引的使用场景
-
多列查询:
-
当查询条件涉及多个列时,联合索引可以显著提高查询性能。例如:
sql复制
SELECT * FROM orders WHERE customer_id = 1 AND order_date > '2024-01-01';
在这种情况下,联合索引
(customer_id, order_date)
可以高效地过滤数据。
-
-
排序和分组:
-
联合索引还可以用于优化排序和分组操作。例如:
sql复制
SELECT customer_id, order_date, SUM(amount) FROM orders GROUP BY customer_id, order_date;
如果存在联合索引
(customer_id, order_date)
,数据库可以利用索引快速完成分组操作。
-
-
范围查询:
-
联合索引对于范围查询也非常有效。例如:
sql复制
SELECT * FROM orders WHERE customer_id = 1 AND order_date BETWEEN '2024-01-01' AND '2024-01-31';
在这种情况下,联合索引
(customer_id, order_date)
可以快速定位到满足条件的数据范围。
-
联合索引的注意事项
-
列的顺序:
-
联合索引中列的顺序非常重要。数据库会按照索引中列的顺序进行排序和查找。例如,对于联合索引
(customer_id, order_date)
:-
查询条件
WHERE customer_id = 1 AND order_date > '2024-01-01'
可以高效使用索引。 -
查询条件
WHERE order_date > '2024-01-01'
无法高效使用索引,因为order_date
不是索引的第一列。
-
-
-
索引覆盖:
-
如果查询的所有列都在联合索引中,数据库可以直接从索引中获取数据,而无需访问表本身。这种情况下,查询性能会非常高。
-
-
维护成本:
-
联合索引会增加插入、更新和删除操作的开销,因为数据库需要维护索引。因此,需要在查询性能和维护成本之间进行权衡。
-
-
冗余索引:
-
如果已经存在联合索引
(customer_id, order_date)
,那么单列索引(customer_id)
是多余的,因为联合索引已经覆盖了单列索引的功能。
-
示例
假设有一个 orders
表,包含以下列:
-
order_id
(主键) -
customer_id
-
order_date
-
amount
创建联合索引:
sql复制
CREATE INDEX idx_customer_order_date
ON orders (customer_id, order_date);
查询示例:
sql复制
-- 查询特定客户的订单,按日期过滤
SELECT * FROM orders
WHERE customer_id = 1 AND order_date > '2024-01-01';-- 查询特定客户的订单,按日期分组统计金额
SELECT customer_id, order_date, SUM(amount)
FROM orders
GROUP BY customer_id, order_date;
总结
联合索引是数据库中一种强大的工具,可以显著提高多列查询的性能。通过合理设计联合索引,可以优化查询性能,但需要注意索引的维护成本和列的顺序。
什么情况下索引会失效?
谈一谈你对SQL优化的经验
Spring
Spring框架下的单例Bean是线程安全的吗?
什么是AOP,你在项目中是否使用过AOP?
记录日志:
把这些通用代码抽出来,避免跟你的业务代码进行耦合:
定义一个切面类,切面类里面会完成日志的书写:
Spring中事务是如何实现的?
注意如果要开启事务,我们需要在这个方法上添加@Transactional注解。
Spring中事务失效的场景有哪些?
事务失效会导致from账户的钱减少但是to账户的钱并不会增加
Spring中什么是动态代理?什么是代理
在 Spring 框架中,代理(Proxy) 和 动态代理(Dynamic Proxy) 是核心概念,特别是在实现 AOP(面向切面编程)时。它们允许在不修改原始对象代码的情况下,为对象添加额外的行为。下面分别解释这两个概念:
1. 代理(Proxy)
代理 是一种设计模式,它允许创建一个代理对象,该对象可以控制对实际对象的访问。代理对象可以添加额外的逻辑,例如权限检查、缓存、日志记录等,而无需修改原始对象的代码。
在 Spring 中,代理通常用于实现 AOP,通过代理对象来拦截方法调用,并在方法调用前后插入额外的逻辑。
2. 动态代理(Dynamic Proxy)
动态代理 是一种特殊的代理机制,它允许在运行时动态地创建代理对象,而不是在编译时创建。动态代理对象的创建是基于一组接口或父类,代理对象会实现这些接口或继承父类,并在方法调用时插入额外的逻辑。
Spring 使用动态代理来实现 AOP,主要有两种方式:
-
基于接口的动态代理(JDK 动态代理)
-
基于类的动态代理(CGLIB 动态代理)
1. 基于接口的动态代理(JDK 动态代理)
JDK 动态代理是 Java 提供的一种内置机制,用于在运行时动态创建代理对象。它要求目标对象实现一个或多个接口。代理对象会实现这些接口,并在方法调用时通过 InvocationHandler
插入额外的逻辑。
2. 基于类的动态代理(CGLIB 动态代理)
CGLIB 是一个第三方库,用于在运行时动态创建代理对象。与 JDK 动态代理不同,CGLIB 不要求目标对象实现接口,而是通过继承目标类来创建代理对象。代理对象会覆盖目标类的方法,并在方法调用时插入额外的逻辑。
Spring 中的动态代理
Spring 使用动态代理来实现 AOP,具体选择哪种代理方式取决于目标对象的类型:
如果目标对象实现了接口,Spring 会优先使用 JDK 动态代理。
如果目标对象没有实现接口,Spring 会使用 CGLIB 动态代理。
总结
-
代理 是一种设计模式,允许创建一个代理对象来控制对实际对象的访问。
-
动态代理 是一种在运行时动态创建代理对象的机制,Spring 使用动态代理来实现 AOP。
-
Spring 支持两种动态代理方式:
-
JDK 动态代理:基于接口,适用于目标对象实现接口的情况。
-
CGLIB 动态代理:基于类,适用于目标对象没有实现接口的情况。
-
事务管理在 Spring 中就是通过动态代理来实现的。
通过动态代理,Spring 可以在不修改原始代码的情况下,为对象添加额外的行为,从而实现 AOP 的功能。