# 使用介绍 ## 配置文件: ```yml spring: redis: database: 0 host: r-xxxx.redis.rds.aliyuncs.com password: xxxx port: 6379 timeout: 2s elab: # 注解的统一超时时间 ttl: 30 # 注解的统一前缀 prefix-with: user_ ``` ## 使用类 ### CacheTemplate 该类一共有个两个属性: `RedissonClient`、`RedisTemplate` 分别应用到分布式锁以及普通的对象操作。 关于分布式锁的应用简单使用案例 ```java @Autowired private CacheTemplate cacheTemplate; /** * 同步和异步 */ @Test public void testApp() throws Exception { RAtomicLong longObject = RLock xxx = cacheTemplate.getRedissonClient().getAtomicLong("myLong"); // 同步执行方式 longObject.compareAndSet(3, 401); // 异步执行方式 RFuture result = longObject.compareAndSetAsync(3, 401); Boolean isLock = result.get(); } ``` 针对原子性的操作[参考](https://github.com/redisson/redisson/wiki/8.-%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E5%92%8C%E5%90%8C%E6%AD%A5%E5%99%A8) # 针对SpringCache注解使用介绍 ## 开启注解 `@EnableCaching ` **常用注解** - `@Cacheable`:触发操作将数据保存到缓存中,参数value指cacheName - `@CacheEvict`:触发操作将数据从缓存中删除(运用于失效模式) - `@CachePut`:不影响方法执行更新(运用于双写模式) - `@Caching`:组合以上多个操作 - `@CacheConfig` :再类级别上共享有关缓存的配置 **默认配置** - key自动生成:缓存名字::SimpleKey[] - value默认是jdk序列化 - 默认ttl时间:-1 - 默认查询数据如果缓存中存在,则不再调用方法,**直接将缓存中命中的数据返回** ### Cacheable 属性介绍: #### **sync** 在多线程环境下,某些操作可能使用相同参数同步调用。默认情况下,缓存不锁定任何资源,可能导致多次计算,而违反了缓存的目的。对于这些特定的情况,属性 sync 可以指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中。 ```java @Cacheable(cacheNames="foos", sync="true") ``` #### **condition** 有时候,一个方法可能不适合一直缓存(例如:可能依赖于给定的参数)。属性condition支持这种功能,通过SpEL 表达式来指定可求值的boolean值,为true才会缓存(在方法执行之前进行评估)。 ```java @Cacheable(cacheNames="book", condition="#name.length < 32") ``` 此外,还有一个unless 属性可以用来是决定是否添加到缓存。与condition不同的是,unless表达式是在方法调用之后进行评估的。如果返回false,才放入缓存(与condition相反)。 #result指返回值 例: ```java @Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.name.length > 5"") ``` ### CacheEvict spring cache不仅支持将数据缓存,还支持将缓存数据删除。此过程经常用于从缓存中清除过期或未使用的数据。 @CacheEvict要求指定一个或多个缓存,使之都受影响。此外,还提供了一个额外的参数allEntries 。表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素。 ```java @CacheEvict(cacheNames="books", allEntries=true) ``` 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。 ```java @CacheEvict(cacheNames="books", beforeInvocation=true) ```