# springboot-cache-redis **Repository Path**: juniorshy/springboot-cache-redis ## Basic Information - **Project Name**: springboot-cache-redis - **Description**: springboot-cache-redis整合 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-10-23 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springboot-cache-redis #### 项目介绍 springboot-cache-redis整合 #### 笔记摘要 /* @CacheEvict缓存清除 key:指定要清除的数据 allEntries = true指定这个缓存中所有的数据 beforeInvocation = false;缓存的清除是否在方法之前执行;默认缓存是在方法执行之后执行;如果出现异常缓存就不会清除 beforeInvocation = true;代表清除缓存是在方法执行之前执行,无论方法是否出现异常,缓存都清除 */ 将方法的运行结果进行缓存;以后再要相同的数据,直接从缓存中获取,不用调用方法; cacheManager管理多个Cache组件的,对缓存的真正CRUD操作在Cache组建中,每一个缓存组件都有自己唯一的名字; 几个属性; cacheName/value:指定缓存组件的名字; key:缓存数据使用的key:可以用它来指定。默认是使用方法参数的值 1-方法的返回值 编写sqEL: #id;参数id的值 #a0 #p0 #root.args[0] keyGenerator:key的生产器;可以自己指定key的生成器的组件id key/keyGenerator:二选一使用 cacheManger:指定缓存管理器;或者cacheResolver指定获取解析器 candition:指定符合条件的情况下才缓存; unless;否定缓存;当unless指定条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断 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.SimpleCacheConfiguration org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration 3、默认生效配置类 SimpleCacheConfiguration 4、给容器注册一个CacheManager:ConcurrentMapCacheManager 5、可以获取和创建ConcurrentMapCache类型的缓存组件;他的作业将数据保存在ConcurrentMap中; 运行流程 @Cacheable: 1、方法运行之前,先去查询cache(缓存组件),按照cacheName指定的名字获取; (CacheManager现获取相应的缓存),第一次获取缓存如果没有Cache组件会自动创建。 2、去Cache中查找缓存内容,使用一个key,默认就是方法的参数; key是按照某种策略生成的;默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key SimpleKeyGenerator生成key的默认策略; 如果没有参数:key=new SimpleKey(); 如果有一个参数:key=参数值 如果有多个参数:key=new SimpleKey(params) 3、没有查到缓存就调用目标方法 4、将目标方法返回的结果,放到缓存中 @Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询 如果没有就运行方法并将其结果放入缓存;以后再来调用就可以直接使用缓存中的数据; 核心: 1)、使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件 2)、key使用keyGenerator生成的,默认是SimpleKeyCenerator 几个属性; cacheName/value:指定缓存组件的名字;将方法的返回结果放在那个缓存中,是数组的方式,可以指定多个缓存; key:缓存数据使用的key:可以用它来指定。默认是使用方法参数的值 1-方法的返回值 编写sqEL: #id;参数id的值 #a0 #p0 #root.args[0] keyGenerator:key的生产器;可以自己指定key的生成器的组件id key/keyGenerator:二选一使用 cacheManger:指定缓存管理器;或者cacheResolver指定获取解析器 candition:指定符合条件的情况下才缓存; ,condition="#id>0" condition="#a0>1":第一个参数值>1才进行缓存 unless;否定缓存;当unless指定条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断 unless="#result==null" unless="#a0==2":如果第一个参数值是2,结果不缓存 sync:是否使用异步模式:默认false,在异步情况下unless无法使用 @CachePut:既调用方法,又更新缓存数据 修改了数据库的某个数据,同时更新缓存; 运行时机: 1、先调用目标方法 2、将目标方法的结果缓存起来 如果@CachePut的key与@Cacheable不统一,在先进行@Cacheable查询某数据后,再通过@CachePut 对该数据修改,再用@Cacheable时候,查出的结果依然是第一次@Cacheable查询的结果 @CacheEvict(/*value = "emp",*/key = "#id",beforeInvocation = true,allEntries = true)//如果不设置value,key,执行此方法会报错 @Caching( cacheable = { @Cacheable(/*value = "emp"*/key = "#name") }, put ={ @CachePut(/*value = "emp",*/key = "#result.id"), @CachePut(/*value = "emp",*/key = "#result.email") } ) ####引入redis的starte @MapperScan("com.springbootcache.cachedemo.mapper") @SpringBootApplication @EnableCaching//开启基于注解的缓存 测试: CacheManager==Cache缓存组件来实际给缓存中存入数据 引入redis的starter,容器中保存的是RedisCacheManager RedisCacheManager帮我们创建RedisCache来作为缓存组件;RedisCache通过redis缓存数据 默认保存数据k-v都是object;利用序列化保存;需要配置保存为json 1、引入redis的starter,cacheManager变为RedisCacheManager; 2、默认创建的RedisCacheManager操作redis使用的是RedisTemplate 3、RedisTemplate是默认使用jdk的序列话机制 4、自定义CacheManager; ##*** 记得启用缓存 spring.cache.type=none ##*** 缓存的对象必须实现Serializable ##*** 除GuavaCacheManager之外都支持Spring事务,即回滚时Cache的数据也会被移除 #spring.cache.type=none