面试基础总结

书中人 2022年03月28日 1,671次浏览

spring

aop简单来说就是面向切面编程,就是将那些与业务无关的逻辑进行封装提取出来,在代码运行的时候动态的插入进去,减少系统中的重复代码,降低模块间的耦合性,有更好的可操作性行和维护性。
spring aop有两种实现方式,一种是jdk的动态代理,一种是cglib代理。
如果一个类有接口,就采用jdk代理,否则才有cglib。
然后一般在使用的时候有两中常用的方式,一种是注解形式的,一种是包范围形式的。

redis

redis缓存击穿:
	缓存没有值,数据库还有值 -> 设置随机失效时间
redis缓存穿透:
	缓存没有值,数据库也没值 -> 恶意攻击单个没有值的数据,造成数据库压力大,每次查询数据后,缓存设置默认值
突发性热点数据激增,导致打量请求全部打到数据库,导致数据库压力过大 
-> DCL 双重检测所 -> 加锁,所里面在查询缓存,让后边排队来的都从锁里面的缓存中获取。

缓存双写不一致问题:线程1查出来在设置redis的时候(还没有设置),
线程2又重新修改了数据在设置了redis,然后在切刀线程1再次设置,
结果造成数据课和缓存不一致。--> 添加分布式锁 (读写锁)
一定要加finnally进行解锁
分布式锁优化的设置:1:setnx,如果当前数据有值,就设置不进去,返回0,如果当前数据库没有,就可以设值进去返回1,

缓存的基本设计思路
 首先查询缓存,如果有缓存,设置读延期,延期时间随机,如果为 数据库特殊空值也设置读延期
 如果没有查询数据库:
 	如果数据库有值,设置redis缓存加过期时间。如果不存在,设置特殊空值加过期时间。