数据库的读写并发一直都是应用性能的瓶颈所在之一,针对改动频率很小的数据我们应该将他存放到缓存中,减少与数据库的交互。

启用对缓存的支持

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学习之旅(十四)--缓存的更多相关文章

  1. Spring学习之旅(十)--MockMvc

    在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...

  2. Spring学习之旅(四)Spring工作原理再探

    上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...

  3. Java框架spring 学习笔记(十四):注解aop操作

    回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...

  4. Spring学习之旅(十五)--SpringBoot

    在使用 Spring 的过程中,有时候会出现一些 ClassNotFoundException 异常,这是因为 JAR 依赖之间的版本不匹配所导致的.而 Spring Boot 就能避免绝大多数依赖版 ...

  5. Spring学习之旅(十二)--持久化框架

    对于本职工作来说 JDBC 就可以很好的完成,但是当我们对持久化的需求变得更复杂时,如: 延迟加载 预先抓取 级联 JDBC 就不能满足了,我们需要使用 ORM框架 来实现这些需求. Spring 对 ...

  6. 设计模式学习(二十四):Spring 中使用到的设计模式

    设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...

  7. Linux学习总结(十四)—— 查看CPU信息

    文章首发于[博客园-陈树义],点击跳转到原文Linux学习总结(十四)-- 查看CPU信息. Linux学习总结(十四)-- 查看CPU信息 商用服务器CPU最常用的是 Intel Xeon 系列,该 ...

  8. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  9. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

随机推荐

  1. ubuntu16.04服务器上无root权限,配置个人tensorflow环境--cuda9.0+cuDNN7+tensorflow-gpu-1.8

    本人在服务器上已经用Anconda创建好python3.5的环境,这个网上有一大堆教程.接下来是重点. 1. cuda的安装 https://developer.nvidia.com/cuda-dow ...

  2. Java 常见面试题整理

    操作系统 说一下线程和进程,它们的区别 同步和异步的区别 阻塞和非阻塞的区别 操作系统中死锁的四个必要条件 mmap和普通文件读写的区别,mmap的注意点 CPU密集型和IO密集型的区别 Linux ...

  3. Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...

  4. 聊聊HTML5中的Web Notification桌面通知

    有的时候我们会在桌面右下角看到这样的提示: 这种桌面提示是HTML5新增的 Web Push Notifications 技术. Web Notifications 技术使页面可以发出通知,通知将被显 ...

  5. CF803D 题解

    题面 正解:一道二分大水题! A:为什么我得不到满分? B : 评测的系统不一样啊! A : 蛤? 正常情况下我们日常练习均使用的是windows系统,在windows下,string 本身是可以存储 ...

  6. 【Java例题】6.2 日期类的使用

    2.日期类的使用.显示今天的年月日.时分秒和毫秒数.显示今天是星期几.是今年内的第几天.显示本月共几天,今年是不是闰年.显示两个日期的差,包括年月日.时分秒和毫秒差值. package chapter ...

  7. 解决 Android 中出现依赖多个版本支持库的问题

    在 app 的 build.gradle 中引入依赖时发现如下错误: All com.android.support libraries must use the exact same version ...

  8. C++这么难,为什么还要学习C++呢?如何学?

    在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃. 这个世界本来就是残酷的,所以你不能怪C++向你展示了世界的本质 大 ...

  9. 算法与数据结构基础 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  10. android——实现跨程序访问数据

    使用之前的SQLite存储的应用程序.首先需要在这个应用程序中创建内容提供器,右击com.example.administrator.exp7包→New→Other→Content Provider, ...