Spring4 缓存

一 缓存命中率

命中率 = 从缓存中读取的次数 / (总读取次数[从缓存中读取的次数 + 从慢速设备上读取的次数])
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);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,226评论 0 4
  • 在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而...
    零一间阅读 4,377评论 0 12
  • 缓存是让数据更接近于使用者;工作机制是先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存);...
    空之古城阅读 5,160评论 0 8
  • 朱华五月下江南,姑苏城里笙箫伴。 即兴吟唱诗一首,疑是唐宋古诗传。
    老槐树阅读 1,639评论 0 4
  • @王红娟 雾霭蒙蒙,先生一路东去, 两旁树影叠叠,向后奔去, 汽笛阵阵,车随人动, 满脸愁容,头脑晕胀, 洪昌先生...
    宏昌居士123阅读 1,715评论 0 1

友情链接更多精彩内容