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的好处:
- 基于注解,代码清爽简洁;
- 基于注解也可以实现复杂的逻辑;
- 可以对缓存进行回滚;
- 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
注意:
当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。 如
@Cacheable(key = "targetClass + methodName +#参数名称")
使用方法参数时我们可以直接使用“#参数名”或者“#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,拦截处理,在CacheAspectSupport的execute方法中进行的处理。
- 实体类一定要实现序列化Serializable
- 启动类注解@EnableCaching开启缓存
- @Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存。
@Cacheable(value = "命名空间" ,key = "targetClass + methodName +#参数名") //SpEL上下文数据语法 - @CachePut注解的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
和 @Cacheable 不同的是,它每次都会触发真实方法的调用 。
简单来说就是用户更新缓存数据。但需要注意的是该注解的value 和 key 必须与要更新的缓存相同,也就是与@Cacheable 相同。 - @CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 。
- 组合@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生成器。
… ↩︎
Spring Cache 简介的更多相关文章
- Spring Boot 2.X(七):Spring Cache 使用
Spring Cache 简介 在 Spring 3.1 中引入了多 Cache 的支持,在 spring-context 包中定义了org.springframework.cache.Cache 和 ...
- 基于Spring Cache实现二级缓存(Caffeine+Redis)
一.聊聊什么是硬编码使用缓存? 在学习Spring Cache之前,笔者经常会硬编码的方式使用缓存. 我们来举个实际中的例子,为了提升用户信息的查询效率,我们对用户信息使用了缓存,示例代码如下: @A ...
- Spring Cache抽象详解
缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/I ...
- Spring Cache 笔记
@(Java ThirdParty)[Spring Cache] Spring Cache Abstraction 简介 Spring Cache提供了对底层缓存使用的抽象,通过注解的方式使用缓存,减 ...
- Spring Boot从入门到精通之:一、Spring Boot简介及快速入门
Spring Boot Spring Boot 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来 ...
- 转:Spring Cache抽象详解
缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/I ...
- SpringBoot--使用Spring Cache整合redis
一.简介 Spring Cache是Spring对缓存的封装,适用于 EHCache.Redis.Guava等缓存技术. 二.作用 主要是可以使用注解的方式来处理缓存,例如,我们使用redis缓存时, ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
随机推荐
- hive简述
显示表头,当前终端有效 set hive.cli.print.header=true; 查看表结构 desc table; 详细的表结构 desc formatted table; 删除表 drop ...
- [转]ThinkPHP分页实例
很多人初学thinkphp时,不太熟悉thinkphp的分页使用方法,现在将自己整理的分页方法分享下,有需要的朋友可以看看. 控制器中的代码: $db = M("cost" ...
- Beaglebone Black的引脚分配
转自:http://blog.csdn.net/daxueba/article/details/50998000 Beaglebone Black的引脚分配 绝大多数的微型开发平台都提供了一些称为GP ...
- UVA 240 Variable Radix Huffman Encoding
题目链接:https://vjudge.net/problem/UVA-240 题目大意 哈夫曼编码是一种最优编码方法.根据已知源字母表中字符出现的频率,将源字母表中字符编码为目标字母表中字符,最优的 ...
- 剑指offer——30栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- linux下链接时缺少动态链接库
1, 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边 ln -s /where/you/install/lib/*.so /usr/libsudo ldconfig 2, ...
- LeetCode 31. Next Permutation【Medium】
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 2018湘潭大学程序设计竞赛【H】
题目链接:https://www.nowcoder.com/acm/contest/105/H 题意:两个操作,一个在[l,r]区间放颜色为c的球,一个统计在[l,r]里有多少不同颜色的球. 题解:哎 ...
- jquery与zend framework编写的联动选项效果
html部分: <pre name="code" class="html"><!DOCTYPE html PUBLIC "-//W3 ...
- SQL SERVER 2008R2 执行大脚本文件时,提示“内存不足”的解决办法
我把一个数据库的架构及数据都已脚本的方式拷贝下来,再去新建一个数据库想把脚本执行一下,但提示如下错误: 问题描述: 当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库, 但是 ...