Spring Cache - 缓存机制

文章有参看其他博主文章

  • https://www.jianshu.com/p/33c019de9115
  • https://blog.csdn.net/dreamhai/article/details/80642010
  • https://www.cnblogs.com/haoming1100/articles/10473192.html
一、概述
  • Spring 3.1起,提供了注解式的cache缓存,且提供了Cache抽象,在此之前一般通过AOP实现

  • 通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成

  • 提供事务回滚时也自动回滚缓存

  • 支持比较复杂的缓存逻辑

二、有关缓存的概念
1.什么是缓存
  • 缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。
  • 缓存往往使用的是RAM(断电既掉的非永久存储,例如电脑内存),所以在用完后还是会把文件送到硬盘等存储器中永久存储
2.缓存的作用
  • 由于缓存的数据比内存快的多,所以缓存的作用就是帮助硬件或者应用程序更快的运行。
3.常见的缓存策略
  • 详细解读可参考这篇文章:https://zhuanlan.zhihu.com/p/86266625
策略 说明
Cache-Aside(预留缓存模式) Cache-Aside 可能是最常用的缓存策略。在这种策略下,应用程序(Application)会与缓存(Cache)和数据源(Data Source)进行通信,应用程序会在命中数据源之前先检查缓存
Read-Through(穿透读) 在上面的 Cache-Aside 策略中,应用程序需要与缓存和数据源“打交道”,而在 Read-Through策略下,应用程序无需管理数据源和缓存,只需要将数据源的同步委托给缓存提供程序 Cache Provider 即可。所有数据交互都是通过抽象缓存层完成的。
Write-Through(穿透写) 当发生数据更新(Write)时,缓存提供程序 Cache Provider 负责更新底层数据源和缓存。缓存与数据源保持一致,并且写入时始终通过抽象缓存层到达数据源。
Write-Behind(延迟写) 如果没有强一致性要求,我们可以简单地使缓存的更新请求入队,并且定期将其 flush 刷新到数据存储中。也就是说,Write-Behind 在数据更新时,只写入缓存。优点是数据写入速度快,适用于繁重的写工作负载。与 Read-Through 配合使用,可以很好地用于混合工作负载,最近更新和访问的数据总是在缓存中可用。
4.缓存命中率
  • 命中率 = 从缓存中读取次数 / (总读取次数[从缓存中读取次数 + 从慢速设备(磁盘)上读取的次数])

  • Miss率 = 没有从缓存中读取的次数 / (总读取次数[从缓存中读取次数 + 从慢速设备上读取的次数])

5.缓存淘汰策略
  • 详细解读可参考:https://www.jianshu.com/p/4cd5509eec3d
策略 说明
FIFO(First in First out) 先进先出。在FIFO Cache设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉。
LFU(Least Frequently Used) 最近最少使用算法,一定时间段内使用次数(频率)最少的那个被移除
LRU(Least Recently Used) 最久未使用算法,使用时间距离现在最久的那个被移除
三、Spring中的缓存
1.Cache接口的定义
  • 在Spring中定义了接口Cache作为标准API,源码如下

    package org.springframework.cache;  
      
    public interface Cache {
           
        
        String getName();  //缓存的名字  
        
        Object getNativeCache(); //得到底层使用的缓存,如Ehcache  
        
        ValueWrapper get(Object key); //根据key得到一个ValueWrapper,然后调用其get方法获取值  
        
        <T> T get(Object key, Class<T> type);//根据key,和value的类型直接获取value  
        
        void put(Object key, Object value);//往缓存放数据  
        
        void evict(Object key);//从缓存中移除key对应的缓存  
        
        void clear(); //清空缓存  
      
        interface ValueWrapper {
          //缓存值的Wrapper  
            Object get(); //得到真实的value  
        }  
    } 
    

    默认实现了Cache接口的有如下类

    类名 说明
    ConcurrentMapCache 使用java.util.concurrent.ConcurrentHashMap实现的Cache
    GuavaCache 对Guava com.google.common.cache.Cache进行的Wrapper,需要Google Guava 12.0或更高版本,@since spring 4
    EhCacheCache 基于net.sf.ehcache.Ehcache的实现
    JCacheCache 对javax.cache.Cache进行的wrapper,@since spring 3.2
  • 此外,由于可以使用多

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值