spring-cache源码分析图文详解

2,481 阅读3分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

概述

spring-cache可以说是一个缓存框架,既然是一个框架,那么肯定是要帮我们封装一些东西。我们在写业务时,如果要加缓存,假设我们使用的是redis作为缓存,那么我们需要在我们业务方法执行之前检查缓存,执行完成之后需要将结果加到缓存中;当需要更新缓存,我们需要删除缓存或者更新缓存。这些代码其实都是一些模板代码,spring-cache就是来解决这个问题,我们只需要将加上spring-cache提供的注解,spring-cache就会基于aop进行方法增强,增强的逻辑就是上面所说的缓存样板操作,这样带来了很大的便利,同时也可以将业务代码和缓存代码进行解耦。

参考资料

# spring源码分析容器整个生命周期图文详解
# spring源码分析AOP原理图文详解
# spring源码分析事件原理图文详解

spring-cache集成原理

image.png 项目中如果想要集成缓存,那么需要使用@EnableCaching注解,这个注解会导入两个组件,一个是AutoProxyRegistrar用于注册InfrastructureAdvisorAutoProxyCreator是个BeanPostProcessor(相当于`@EnableAspectJAutoProxy),用于创建代理对象;一个是ProxyCachingConfiguration,是一个配置类,里面主要是添加spring-cache的切面,切点,通知组件,也就是增强逻辑。

image.png 知道aop原理应该知道,在创建需要代理对象时候,需要通过切面的切点来进行match,match成功之后,说明满足pointcut,那么就会将Advisor切面和创建的代理对象进行绑定,在代理对象执行的时候,会获取到所有绑定Advisor,然后获取到里面的MethodInterceptor,形成一个拦截器链,执行增强逻辑。这里的CacheInterceptor就是spring-cache的功能实现,帮助我们实现那些缓存逻辑代码。

CacheInterceptor源码分析

image.png

封装好被代理逻辑方法(我们业务代码),然后放在execute作为参数,用于调用。

image.png 这里准备缓存的意思不要误解,底层是通过组合Cache来管理缓存的,通过业务来划分Cache对象,所以这里准备缓存 指的是管理缓存的Cache对象,内部数据还是空的。

image.png 看到上面,对于spring-cache常用注解,@Cacheable,@CachePut,@CacheEvict都有对应增强逻辑

spring-cache底层组件

1.CacheManager是缓存管理器,这个组件是一个暴露的总组件,其它组件都组合在内部来实现缓存功能
2.Cache是用来操作缓存组件,有基本的缓存增删改查接口
3.cacheWriter是操作缓存组件,组合于Cache内部,用来真实缓存客户端读写
4.cacheConfig是缓存配置组件,用来管理缓存配置
5.CacheInterceptor组件是执行CacheManager入口,使用CacheManager封装的缓存功能

spring-cache一些思考

1.缓存存在的缓存雪崩是否解决
2.缓存存在的缓存击穿是否解决
3.缓存存在的缓存穿透是否解决
4.缓存存在数据库缓存数据一致性是否解决
5.自定义key如何实现
6.好像默认不支持缓存过期时间,如何处理
7.缓存宕机,正常业务是否受影响,如何处理

总结

其实spring-cache只是帮我们把一些模板代码使用aop增强实现了,上述问题并没有解决,后期会专门写一篇关于如何用好spring-cache,以及怎么解决这些问题。