Spring Cache 简介

欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot

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. ↩︎

posted @ 2019-08-22 19:22  LittleDonkey  阅读(550)  评论(0编辑  收藏  举报