Spring学习之旅(十四)--缓存
数据库的读写并发一直都是应用性能的瓶颈所在之一,针对改动频率很小的数据我们应该将他存放到缓存中,减少与数据库的交互。
启用对缓存的支持
Spring 对缓存的支持有两种方式:
- 注解驱动的缓存
- XML 申明的缓存
为了避免繁琐的 XML 配置文件,我们这边只讲解注解驱动的形式。
启用缓存功能
@Configuration
// 启用缓存功能
@EnableCaching
public class CachingConfig {
/**
* 申明缓存管理器
* @return
*/
@Bean
public CacheManager cacheManager(){
return new ConcurrentMapCacheManager();
}
}
缓存管理器
Spirng 3.1 内置了五个缓存管理器实现:
- SimpleCacheManager
- NoOpCacheManager
- ConcurrentMapCacheManager
- CompositeCacheManager
- EhCacheCacheManager
Spring 3.2 又提供了两个缓存管理器:
- RedisCacheManager
- GemfireCacheManager
使用 Redis 缓存
配置 Redis 缓存管理器
@Configuration
@EnableCaching
public class CachingConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
RedisCacheManager redisTemplate = RedisCacheManager.create(redisConnectionFactory);
return redisTemplate;
}
}
为方法增加注解以支持缓存
Spring 缓存很大程度上是围绕切面构建的,在 Spring 中启用缓存时,它会创建一个切面用来实现缓存功能。Spring 提供了下面几个注解:
| 注解 | 作用 |
|---|---|
| @Cacheable | 表明 Spring 在方法调用之前,先在缓存中查找方法的返回值,如果没有找到才会调用方法,并且将方法的返回值放入缓存中 |
| @CachePut | 表明 Spring 应该将方法的返回值放到缓存中。在方法的调用前并不会检查缓存,方法始终会被调用 |
| @CacheEvict | 表明 Spring 应用在缓存中清除一个或多个条目 |
| @Caching | 这是一个分组的注解,能够同时应用多个其他的缓存注解 |
@Cacheable 和 @CachePut 注解都是将值放入到缓存中去,它们有一些共有的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
| values | String[] | 要使用的缓存名称 |
| condition | String | SqEL 表达式,如果值为 false,不会将缓存应用到方法调用上 |
| key | String | SqEL 表达式,用来计算自定义的缓存 key |
| unless | String | SqEL 表达式,如果得到的值是 true,返回值不会放到缓存中去 |
最简单的情况下,只需要指定 value 属性即可。
实例
dao 对象:
@Repository
public class UserDao {
@Cacheable(value = "accountUser")
public User findUserByAccount(String account) {
System.out.println("方法被调用");
User user = new User();
user.setAccount(account);
return user;
}
}
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RootConfig.class)
public class CachingTest {
@Autowired
private UserDao userDao;
@Test
public void testFindUserByAccount(){
System.out.println("==========第一次==========");
User user1 = userDao.findUserByAccount("admin");
Assert.assertNotNull(user1);
System.out.println("==========第二次==========");
User user2 = userDao.findUserByAccount("admin");
Assert.assertNotNull(user2);
}
}
控制台输出:
==========第一次==========
方法被调用
==========第二次==========
实例中使用的是 @Cacheable 注解,可以看到第一次调用的时候,缓存中还没有数据,所以方法被调用;第二次调用的时候发现缓存中有数据,所以不再调用方法
Spring学习之旅(十四)--缓存的更多相关文章
- Spring学习之旅(十)--MockMvc
在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...
- Spring学习之旅(四)Spring工作原理再探
上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...
- Java框架spring 学习笔记(十四):注解aop操作
回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...
- Spring学习之旅(十五)--SpringBoot
在使用 Spring 的过程中,有时候会出现一些 ClassNotFoundException 异常,这是因为 JAR 依赖之间的版本不匹配所导致的.而 Spring Boot 就能避免绝大多数依赖版 ...
- Spring学习之旅(十二)--持久化框架
对于本职工作来说 JDBC 就可以很好的完成,但是当我们对持久化的需求变得更复杂时,如: 延迟加载 预先抓取 级联 JDBC 就不能满足了,我们需要使用 ORM框架 来实现这些需求. Spring 对 ...
- 设计模式学习(二十四):Spring 中使用到的设计模式
设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...
- Linux学习总结(十四)—— 查看CPU信息
文章首发于[博客园-陈树义],点击跳转到原文Linux学习总结(十四)-- 查看CPU信息. Linux学习总结(十四)-- 查看CPU信息 商用服务器CPU最常用的是 Intel Xeon 系列,该 ...
- 我的MYSQL学习心得(十四) 备份和恢复
我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...
随机推荐
- Java学习笔记之---Servlet
Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...
- C#编程.异常处理(Exception Handling Statements)
C#语言包含结构化异常处理(Structured Exception Handling,SEH). throw The throw statement is used to signal the oc ...
- JAVA项目从运维部署到项目开发(五. Nginx)
<Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器>一文简单介绍了关于直播数据流的nginx相关配置,下面简单介绍下各种项目如何配置nginx. web项目. ...
- k8s1.9.0安装--完整集群部署
三.完整集群部署 - kubernetes-with-ca 1. 理解认证授权 1.1 为什么要认证 想理解认证,我们得从认证解决什么问题.防止什么问题的发生入手.防止什么问题呢?是防止有人入侵你的集 ...
- Java&mysql:过滤文件内容,将新文件内容存入mysql数据库
在上一篇博文jdbc连接数据库中我已经简单介绍了如何连接到mysql数据库,今天要总结的是学长给我布置的一个小作业,把一个很大的已经用","分开了的一行一行的txt文件内容过滤掉注 ...
- Oracle 数据库登录、用户解锁、改密码、创建用户授权操作
一.数据库登录1.常用账户: 管理员: sys主要练习操作用户: scott2.测试环境是否配置成功: 1.命令窗口 win+R -> cmd(以管理员身份运行) - > sqlplus ...
- 虚IP解决程序连只读服务器故障漂移
目前公司有一套核心交易数据库配置了AlWaysON,SQL 2012版本, 1主4从, 其从库(8,14, 8.15) 这2台只读的从数据库服务器, 后台程序和wms等很多程序,都是直接配置IP连接这 ...
- 【Android Studio】提示代码忽略大小写
在 Preference... 中找到如下,设置 Case sensitive completion 为 None 即可,如下图: PS: 该截图是 Intellij IDEA (Android St ...
- 【iOS】arc4random() 产生随机数
通过 arc4random() 获取 0 到 x-1 之间的整数的代码如下: int value = arc4random() % x; 获取 1 到 x 之间的整数的代码如下: ; PS: 这里用到 ...
- pycharm与monkeyrunner测试
操作命令: 导包: import sysfrom com.android.monkeyrunner import MonkeyRunner,MonkeyDevice device=MonkeyR ...