一 缓存命中率
命中率 = 从缓存中读取的次数 / (总读取次数[从缓存中读取的次数 + 从慢速设备上读取的次数])
Miss率 = 没有从缓存中读取的次数 / (总读取次数[从缓存中读取的次数 + 从慢速设备上读取的次数])
二 过期策略
- FIFO(First In First Out) 先进先出策略,即先放入缓存的数据先被移除
- LRU (Least Recently Used)最久未使用策略,即使用时间距离现在最久的那个被移除
- LFU(Least Frequently Used)最近最少使用策略,即一定时间段内使用次数最少的那个被移除
- TTL (Time To Live) 存活期 ,即从缓存中创建时间点开始直至到期的一个时间段
- TTI (Time To Idle)空闲期 即一个数据多久没被访问就从缓存中移除
三 Spring4 缓存注解
使用Spring 缓存注解时一定要通过:<cache:annotation-driven/> 开启基于注解的缓存驱动
@Cacheable
参数 | 说明 | 示例 |
---|---|---|
value/cacheNames | 缓存的名称,必须指定最少一个 | @Cacheable(cacheNames="user") |
key | 缓存的Key 可以为空,如果指定则按Spel 表达式编写。如果不指定,则默认按照方法的所有参数进行组合 | @Cacheable(cacheNames="user",key="#id") |
condition | 缓存的条件,可以为空,使用Spel表达式编写,返回True或者False 只有返回True才进行缓存 | @Cacheable(cacheNames="user",condition="#userName.length() > 2") |
@CachePut
参数 | 说明 | 示例 |
---|---|---|
value/cacheNames | 缓存的名称,必须指定最少一个 | @CachePut(cacheNames="user") |
key | 缓存的Key 可以为空,如果指定则按Spel 表达式编写。如果不指定,则默认按照方法的所有参数进行组合 | @CachePut(cacheNames="user",key="#id") |
condition | 缓存的条件,可以为空,使用Spel表达式编写,返回True或者False 只有返回True才进行缓存 | @CachePut(cacheNames="user",condition="#userName.length() > 2") |
@CacheEvict
@CacheEvict 注解是@Cacheable 的反向操作 负责从给定的缓存中移除值
参数 | 说明 | 示例 |
---|---|---|
value/cacheNames | 缓存的名称,必须指定最少一个 | @CacheEvict (cacheNames="user") |
key | 缓存的Key 可以为空,如果指定则按Spel 表达式编写。如果不指定,则默认按照方法的所有参数进行组合 | @CacheEvict(cacheNames="user",key="#id") |
condition | 缓存的条件,可以为空,使用Spel表达式编写,返回True或者False 只有返回True 才会清空缓存。unless属性与condition属性相反,满足条件不进进行缓存 | @CachePut(cacheNames="user",condition="#userName.length() > 2") |
allEntries | 是否清空所有的缓存内容,默认为false 如果指定为True 则方法调用后会立即清除所有缓存 | @CacheEvict(cacheNames="user",allEntries=true) |
beforeInvocation | 是否在执行方法前就清空,默认为false 如果指定为true 则在方法没有执行的时候就清空缓存。在默认情况下,如果方法执行抛出异常,则不会清除缓存 | @CacheEvict(cacheNames="user",beforeInvocation=true) |
@CacheConfig
类级别的全局缓存注解
例如:@CacheConfig(cacheNames="users",keyGenerator="myKeyGenerator")
四 自定义缓存注解
Spring 提供了自定注解 可以把这些注解组合到一个注解中
@Caching(
put = {
@CachePut(cacheNames="users",key="#user.id"),
@CachePut(cacheNames="users",key="#user.userName"),
@CachePut(cacheNames="users",key="#user.email")
}
)
public @interface UserServiceCache {
}
@UserServiceCache
public SysUser getSysUserById(String id) {
return sysUserDao.getSysUserById(id);
}