美文网首页
Spring Cache

Spring Cache

作者: 会走的桃子 | 来源:发表于2018-10-17 10:43 被阅读0次

    缓存命中率

    即从缓存中读取数据的次数 与 总读取次数的比率,命中率越高越好:
    命中率 = 从缓存中读取次数 / (总读取次数[从缓存中读取次数 + 从慢速设备上读取的次数])
    Miss率 = 没有从缓存中读取的次数 / (总读取次数[从缓存中读取次数 + 从慢速设备上读取的次数])
    这是一个非常重要的监控指标,如果做缓存一定要健康这个指标来看缓存是否工作良好;

    移除策略

    移除策略(Eviction policy),即如果缓存满了,从缓存中移除数据的策略;常见的有LFU、LRU、FIFO。
    FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除;
    LRU(Least Recently Used):最久未使用算法,使用时间距离现在最久的那个被移除;
    LFU(Least Frequently Used):最近最少使用算法,一定时间段内使用次数(频率)最少的那个被移除;

    TTL(Time To Live )

    存活期,即从缓存中创建时间点开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期)

    TTI(Time To Idle)

    空闲期,即一个数据多久没被访问将从缓存中移除的时间。

    自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象;在此之前一般通过AOP实现;使用Spring Cache的好处:

    1. 提供基本的Cache抽象,方便切换各种底层Cache;
    2. 通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;
    3. 提供事务回滚时也自动回滚缓存;
    4. 支持比较复杂的缓存逻辑;

    Cache

    Spring提供的核心Cache接口,提供了缓存操作的读取/写入/移除方法;


    Cache的实现类.png
    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  
        }  
    }  
    

    CacheManager

    因为我们在应用中并不是使用一个Cache,而是多个,因此Spring还提供了CacheManager抽象,用于缓存的管理

    public interface CacheManager {  
        Cache getCache(String name); //根据Cache名字获取Cache   
        Collection<String> getCacheNames(); //得到所有Cache的名字  
    }  
    
    CacheManager.png

    除了GuavaCacheManager之外,其他Cache都支持Spring事务的,即如果事务回滚了,Cache的数据也会移除掉。
    Spring不进行Cache的缓存策略的维护,这些都是由底层Cache自己实现,Spring只是提供了一个Wrapper,提供一套对外一致的API。

    Cache注解

    1. @EnableCaching
    2. @CachePut
    public @interface CachePut {  
        String[] value();              //缓存的名字,可以把数据写到多个缓存  
        String key() default "";       //缓存key,如果不指定将使用默认的KeyGenerator生成,后边介绍  
        String condition() default ""; //满足缓存条件的数据才会放入缓存,condition在调用方法之前和之后都会判断  
        String unless() default "";    //用于否决缓存更新的,不像condition,该表达只在方法执行之后判断,此时可以拿到返回值result进行判断了  
    }  
    
    1. @CacheEvict
    public @interface CacheEvict {  
        String[] value();                        //请参考@CachePut  
        String key() default "";                 //请参考@CachePut  
        String condition() default "";           //请参考@CachePut  
        boolean allEntries() default false;      //是否移除所有数据  
        boolean beforeInvocation() default false;//是调用方法之前移除/还是调用之后移除  
    
    1. @Cacheable
      应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有再调用方法获取数据,然后把数据添加到缓存中:
    public @interface Cacheable {  
        String[] value();             //请参考@CachePut  
        String key() default "";      //请参考@CachePut  
        String condition() default "";//请参考@CachePut  
        String unless() default "";   //请参考@CachePut    
    }
    
    1. @Caching
    public @interface Caching {  
        Cacheable[] cacheable() default {}; //声明多个@Cacheable  
        CachePut[] put() default {};        //声明多个@CachePut  
        CacheEvict[] evict() default {};    //声明多个@CacheEvict  
    }  
    

    提供的SpEL上下文数据

    Spring Cache提供了一些供我们使用的SpEL上下文数据


    图片.png

    Key生成器

    如果在Cache注解上没有指定key的话@CachePut(value = "user"),会使用KeyGenerator进行生成一个key:

    条件缓存

    根据运行流程,如下@Cacheable将在执行方法之前( #result还拿不到返回值)判断condition,如果返回true,则查缓存;

    相关文章

      网友评论

          本文标题:Spring Cache

          本文链接:https://www.haomeiwen.com/subject/joahzftx.html