# springboot-SpringCache **Repository Path**: koala1010/springboot-cache ## Basic Information - **Project Name**: springboot-SpringCache - **Description**: springboot-SpringCache - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-05-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 一、搭建基本环境 1、导入数据库文件 创建出department和employee表 2、创建JavaBean封装数据 3、整合Mybatis操作数据库 - 配置数据源信息 - 使用注解版的Mybatis @MapperScan指定要扫描的mapper接口所在的包 二、快速体验缓存 步骤: 1、开启基于注解的缓存 @EnableCaching 2、标注缓存注解 @Cacheable @CachePut @CacheEvict * SpringBoot默认使用的是ConcurrentMapCacheManager和ConcurrentMapCache将数据保存在ConcurrentMap store中,但是开发中常用缓存中间件:redis、memcached、ehcache 三、介绍 1、将方法的运行结果进行缓存,以后再要相同的数据,直接从缓存中获取,不用调用方法。 2、CacheManager管理着多个Cache组件,对缓存的真正CRUD操作都在Cache组件中,每一个缓存组件有自己唯一一个名字。 3、几个属性: cacheNames/value: 指定缓存组件的名字; key:缓存数据使用的key,可以用它来指定。默认使用方法参数的值,也可以用方法的返回值 编写SPEL: #id: 参数id的值 #a0: #p0: #root.args[0]: keyGenerator:key的生成器,可以自己指定key的生成器的组件id key、keyGenerator只能二选一 cacheManager:指定缓存管理器或者cacheResolver指定获取解析器 condition:指定符合条件的情况下才缓存,例如:condition = "#id>0" unless:否定缓存,当unless指定的条件为true,方法的返回值就不会被缓存,可以获取到结果进行判断。例如:unless = "#result == null" sync: 是否使用异步模式 四、原理 1、自动配置类:CacheAutoConfiguration 2、缓存的配置类(按照顺序加载的,前面的有了,就不加载后面的了) org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration org.springframework.boot.autoconfigure.cache.GuavaCacheConfiguration org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration 3、默认生效的配置类: SimpleCacheConfiguration 4、给容器中注册了一个CacheManager:ConcurrentMapCacheManager 5、可以获取和创建ConcurrentMapCache类型的缓存组件,他的作用将数据保存在ConcurrentMap中 五、运行流程 I、@Cacheable:标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询,如果没有就运行方法并把结果放入缓存, 以后再来调用就可以直接使用缓存中的数据。 1、方法运行之前,先去查询Cache(缓存组件),按照cacheNames指定的名字获取。 CacheManager先去获取响应的缓存,第一次获取缓存如果没有则Cache组合会自动创建。 2、去Cache中查找缓存的内容,使用一个key,默认就是方法的参数 key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key SimpleKeyGenerator生成key的默认策略 如果没有参数:key = new SimpleKey(); 如果有一个参数:key = 参数的值 如果有多个参数:key = new SimpleKey(params); 3、没有查到缓存就调用目标方法 4、将目标方法返回的结果,放进缓存中 II、@CachePut:既调用方法,又更新缓存 1、修改了数据库中的某个数据、同时更新缓存 2、运行时机 先调用目标方法 将目标方法的结果缓存起来 key:1 value:lastName:张三 III、CacheEvict:缓存清除 key:指定要清除的数据 allEntries: 指定清除这个缓存中的所有数据 beforeInvocation = false: 缓存的清除是否在方法之前执行,默认代表缓存清除操作是在方法执行之后执行,如果出现异常,缓存就不会清除 beforeInvocation = true: 代表清除缓存操作是在方法运行前执行,无论方法是否出现异常,缓存都清除 六、核心 1、使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件 2、key使用keyGenerator生成的,默认是 SimpleKeyGenerator 七、整合Redis作为缓存 1、安装redis,使用docker 2、引入redis的starter 3、配置redis 4、测试缓存 原理:CacheManager === Cache 缓存组件来实际给缓存中存数据 1)引入redis的starter,容器中保存的是RedisCacheManager 2)RedisCacheManager帮我们创建RedisCache来作为缓存组件,RedisCache通过操作redis缓存数据 3)RedisTemplate是默认使用jdk的序列化机制