zoukankan      html  css  js  c++  java
  • Spring Cache 简介

    org.springframework.cache;
    org.springframework.cache.Cache
    org.springframework.cache.CacheManager

    依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
    

    缓存简介

    缓存:牺牲了空间,让数据更接近于使用者
    工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存)
    缓存内容:那些经常读取且不经常修改的数据

    Spring Cache 简介

    Spring 3.1起,提供了基于注解的对Cache的支持。Spring提供了各种xxxCache的实现。使用Spring Cache的好处:

    1. 基于注解,代码清爽简洁;
    2. 基于注解也可以实现复杂的逻辑;
    3. 可以对缓存进行回滚;
    4. Spring Cache不是具体的缓存技术,而是基于具体的缓存产品(如Guava、EhCache、Redis等)的共性进行了一层封装,但是可以通过简单的配置切换底层使用的缓存。具体的底层缓存技术究竟采用了Guava、EhCache还是Redis,只需要简单的配置就可以实现方便的切换。

    缓存接口

    缓存接口:
        定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等
    
    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抽象,用于缓存的管理。接口方法主要包括根据缓存名获取缓存和获取所有缓存的名字集合

    package org.springframework.cache;  
    
    import java.util.Collection;  
    
    public interface CacheManager {  
    
        Cache getCache(String name);     //根据Cache名字获取Cache   
    
        Collection<String> getCacheNames();     //得到所有Cache的名字  
    
    }
    

    SpEL上下文数据

    Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:

    名称 | 位置 | 描述 | 示例
    :-: |:-: |:-:
    methodName | root对象 | 当前被调用的方法名 | #root.methodname
    method | root对 | 当前被调用的方法 | #root.method.name
    target | root对象 | 当前被调用的目标对象实例 | #root.target
    targetClass | root对象 | 当前被调用的目标对象的类 | #root.targetClass
    args | root对象 当前被调用的方法的参数列表 | #root.args[0]
    caches | root对象 | 当前方法调用使用的缓存列表 | #root.caches[0].name
    Argument Name | 执行上下文 | 当前被调用的方法的参数,如 findArtisan(Artisan artisan),可以通过 #artsian.id 获得参数 | #artsian.id
    result | 执行上下文 | 方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict 的 beforeInvocation=false) | #result

    注意:

    1. 当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。 如

      @Cacheable(key = "targetClass + methodName +#参数名称")

    2. 使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。 如:

      @Cacheable(value="users", key="#id")
      @Cacheable(value="users", key="#p0") (#p0的意思是指加有@Cacheable注解的方法中的第一个参数)

    SpEL提供了多种运算符:

    • 关系 <,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne
    • 算术 +,- ,* ,/,%,^
    • 逻辑 &&,
    • 条件 ?: (ternary),?: (elvis)
    • 正则表达式 matches
    • 其他类型 ?.,?[…],![…],[1],$[…]

    注解

    @Cacheable@CachePut@CacheEvict注解的拦截解析逻辑:
    实际上就是AOP,拦截处理,在CacheAspectSupportexecute方法中进行的处理。

    1. 实体类一定要实现序列化Serializable
    2. 启动类注解@EnableCaching开启缓存
    3. @Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存。
      @Cacheable(value = "命名空间" ,key = "targetClass + methodName +#参数名") //SpEL上下文数据语法
    4. @CachePut注解的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
      和 @Cacheable 不同的是,它每次都会触发真实方法的调用 。
      简单来说就是用户更新缓存数据。但需要注意的是该注解的value 和 key 必须与要更新的缓存相同,也就是与@Cacheable 相同。
    5. @CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 。
    6. 组合@Caching
        @Caching(
            cacheable = {
                    @Cacheable(value = "emp",key = "#p0"),
                    ...
            },
            put = {
                    @CachePut(value = "emp",key = "#p0"),
                    ...
            },evict = {
                    @CacheEvict(value = "emp",key = "#p0"),
                    ....
            })
        public User save(User user) {
            ....
        }
    

    Key生成器:
    如果在Cache注解上没有指定key的话@CachePut(value = "user")会使用KeyGenerator进行生成一个key。默认提供了SimpleKeyGenerator生成器。


    1. ↩︎

  • 相关阅读:
    HTML基础
    Java基础05-计算机单位
    Java基础04-运算符
    Java基础03-数据类型
    Java基础02-变量
    Java基础01-HelloWorld
    MarkDown基本使用
    短视频学习
    c# as 总结
    在C#中使用Nullable类型和 tuple类
  • 原文地址:https://www.cnblogs.com/loveer/p/11396321.html
Copyright © 2011-2022 走看看