# SpringRedisNotes-Cache **Repository Path**: trying326/spring-redis-notes-cache ## Basic Information - **Project Name**: SpringRedisNotes-Cache - **Description**: 基于Spring缓存,注解形式整合Redis及使用 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-15 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring缓存整合使用Redis ## spring的缓存管理器 ```text 在spring项目中它提供了接口CacheManager来定义缓存管理器,这样哥哥不同的缓存就可以实现它来提供管理器的功能了, 而spring-data-redis.jar包中实现CacheManager接口的则是RedisCacheManager,因此使用redis作为缓存,并且被spring管理, 需要先定义RedisCacheManager的bean。 在定义RedisCacheManager的bean之前,还是需要先定义RedisTemplate的。 ``` ## 缓存注解 ```text 注解@Cacheable和@CachePut都可以保存缓存键值对,只是它们的方式略有不同,二者的区别,它们只能运用于有返回值的方法中, 而删除缓存kye的@CacheEvict则可以用在void的方法上,以为它需需要去保存任何值。 ``` 缓存注解详情 |注解|描述| |----|----| |@Cacheable|表明在进入方法之前,spring会先去缓存服务器中查找对应key的的缓存值,如果找到缓存值,那么Spring将不会在调用方法,而是将缓存值读出,返回给调用者;如果没有找到缓存值,那么Spring就会执行方法,将最后的结果通过key保存服务器中| |@CachePut|Spring会将该方法的换绘制华存到服务器中,这里需要注意的是,Spring不会市县区缓存服务器查找,而是直接执行方法,而后缓存。换句话说,该方法始终会被Spring所调用| |@CacheEvict|移出缓存对一个的key的值| |@Caching|这是一个分组注解,它能够同时应用于其他的注解| ```text 上述的注解都能标注到类或者方法上,如果放到类上,则对所有的方法都有效;如果放到方法上,则只是对方法有效。大部分情况下,会放置到方法上。 因为@Cacheable和@CachePut可以配置的属性接近,这里将它们归为一类去介绍,而@Cacheing因为不常用,就不介绍了。 根据注解的不同效果,它们的作用也有些区别,一般而言: 对于查询,建议使用@Cacheable; 对于插入和修改,建议使用@CachePut; 对于删除操作,建议使用@CacheEvict ``` 注解@Cacheable和@CachePut ```text 因为@Cacheable和@CachePut两个注解配置项比较接近,所以这里就将这个两个注解一并介绍了,它们的属性如下: ``` @Cacheable和@CachePut配置属性 |属性|配置类型|描述| |----|----|----| |value|String[]|使用缓存的名称[缓存配置中可以使用的第三方缓存有多个,也可以配置多个缓存管理器,在配置的时候需要给缓存管理器命名,这里需要的就是这个参数]| |condition|String|Spring表达式,如果表达式返回值为false,则不会将缓存应用到方法上,true则会| |key|String|Spring表达式,可以通过它来计算对应缓存的key| |unless|String|Spring表达式,如果表达式返回值为true,则不会将方法的结果放到缓存上| ```text 其中,因为value和key这两个属性使用的最多,所以先来讨论这两个属性。 value是一个数组,可以引用多个缓存管理器。 key是缓存中的键,它支持Spring表达式,通过Spring表达式就可以自定义缓存的key。 先了解一些Spring表达式和缓存注解之间的约定,通过这些原定去引用方法的参数和返回值的内容,使得其注入key所定义的Spring表达式的结果中。 表达式值的引用如下 ``` 表达式值的引用 |表达式|描述|备注| |----|----|----| |#root.args|定义传递给缓存方法的参数|-| |#root.caches|该方法执行是对应的缓存名称,它是一个数组|-| |#root.target|执行缓存的目标对象|-| |#root.targetClass|目标对象类,它是#toot.target.class的缩写|-| |#root.method|缓存方法|-| |#root.methodName|缓存方法的名称,它是#root.method.name的缩写|-| |#result|方法返回结果值,还可以使用Spring表达式进一步读取其属性|注意该表达式不能用户注解@Cacheable,因为该注解的方法可能不会被执行,这样返回值就无从谈起| |#Argument|任意方法的参数,可以通过方法本山的名称或者下标去定义|比如getRole(Long id)方法,向图区id这个参数,就可以谢伟#id,或者#a0、#p0,单个参数,建议使用#id,可读性更高| 注解@cacheEvict ```text 注解@CacheEvict主要是为了移出缓存对应的键值对,主要对于那些删除的操作。 @CacheEvict的属性 value和key与之前的@Cacheable和CachePut是一致的,而属性allEntries要求删除缓存服务器中所有的缓存,这个时候指定的key就将不会生效,所以这个属性要慎用。 beforeInvocation属性指定缓存在方法前或者方法后移除。 beforeInvocation的名字暴露了Spring的实现方法--反射方法,它是通过AOP去实现的,数据库事务的方式也是如此。 和@Transactional一样,beforeInvocation提供了注解和配置项,进一步简化开发。 属性详情如下: ``` @CacheEvict属性 |属性|类型|描述| |----|----|----| |value|Sting[]|要使用的缓存名称| |key|String|指定Spring表达式返回缓存的key| |condition|String|指定Spring表大会,如果返回为true,则执行移除缓存,否则不执行| |allEntries|boolean|如果为true,则删除特定缓存所有键值对,默认值为false,注意他将清除所有缓存服务器的缓存,这个属性慎用| |beforeInvocation|Boolean|指定在方法前后移除缓存,如果指定位true,则在方法前删除缓存,如果为false,则在方法调用后删除缓存,默认值为false| 不适用缓存的方法 ```text 使用注解操作Redis缓存,但是对类 ```