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

Spring Cache 简介的更多相关文章

  1. Spring Boot 2.X(七):Spring Cache 使用

    Spring Cache 简介 在 Spring 3.1 中引入了多 Cache 的支持,在 spring-context 包中定义了org.springframework.cache.Cache 和 ...

  2. 基于Spring Cache实现二级缓存(Caffeine+Redis)

    一.聊聊什么是硬编码使用缓存? 在学习Spring Cache之前,笔者经常会硬编码的方式使用缓存. 我们来举个实际中的例子,为了提升用户信息的查询效率,我们对用户信息使用了缓存,示例代码如下: @A ...

  3. Spring Cache抽象详解

    缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/I ...

  4. Spring Cache 笔记

    @(Java ThirdParty)[Spring Cache] Spring Cache Abstraction 简介 Spring Cache提供了对底层缓存使用的抽象,通过注解的方式使用缓存,减 ...

  5. Spring Boot从入门到精通之:一、Spring Boot简介及快速入门

    Spring Boot Spring Boot 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来 ...

  6. 转:Spring Cache抽象详解

    缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/I ...

  7. SpringBoot--使用Spring Cache整合redis

    一.简介 Spring Cache是Spring对缓存的封装,适用于 EHCache.Redis.Guava等缓存技术. 二.作用 主要是可以使用注解的方式来处理缓存,例如,我们使用redis缓存时, ...

  8. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

  9. Spring 系列: Spring 框架简介 -7个部分

    Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...

随机推荐

  1. 微信-小程序-开发文档-服务端-接口调用凭证:auth.getAccessToken

    ylbtech-微信-小程序-开发文档-服务端-接口调用凭证:auth.getAccessToken 1.返回顶部 1. auth.getAccessToken 本接口应在服务器端调用,详细说明参见服 ...

  2. "Access denied for user 'root@localhost' 试一下你的mysql是不是用任何密码都可以登录,如果是的话这里

    https://blog.csdn.net/light_breeze/article/details/82070222 花了三小时...竟然是因为这个

  3. 面试总结【css篇】- css3新增特性

    1.css3中的关键帧 @keyframes规则通过在动画序列中定义关键帧(或waypoints)的样式来控制CSS动画序列中的中间步骤.这 比转换更能控制动画序列的中间步骤. @keyframes ...

  4. spring在普通类中获取session和request

    在使用spring时,经常需要在普通类中获取session,request等对像.比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts2 ...

  5. RDD运行原理

  6. NOIP提高真题整理(2011-2018)-标签

    加粗的后面应该会有相应的简单解析(如果没咕的话:)). 2011 day1 T1:铺地毯:逆着铺 T2:选择客栈:按颜色分类枚举+二分答案 T3:Mayan游戏:大模拟dfs+剪枝 day2 T1:计 ...

  7. 深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作

    C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的 ...

  8. The linux command 之网络

    一.检查和检测网络 ping命令——向网络主机发送特殊数据包 [me@linuxbox ~]$ ping www.baidu.com 按Ctrl+C终止程序 tracepath——跟踪网络数据包的传输 ...

  9. 如何优雅的在 vue 中添加权限控制

    前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为 ...

  10. 双十一HostGator独立服务器方案

    一年一度的“双十一”购物狂欢节到来,各大电商平台线上消费的各种“吸金”开启了“双十一”模式,一年一度的“双十一”网购狂欢又开始以“巨大的价格优势”来勾起消费者的购买欲望. 此次双十一期间,HostGa ...