本文源码:GitHub·点这里 || GitEE·点这里

一、Cache缓存简介

从Spring3开始定义Cache和CacheManager接口来统一不同的缓存技术;

Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;

Cache接口下Spring提供了各种缓存的实现;

如RedisCache,EhCacheCache ,ConcurrentMapCache等;

二、核心API

1、Cache缓存接口

定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等

2、CacheManager

缓存管理器,管理各种缓存(cache)组件

3、@Cacheable 主要针对方法配置,能够根据方法的请求参数对其进行缓存

Cacheable 执行流程
1)方法运行之前,按照cacheNames指定的名字先去查询Cache 缓存组件
2)第一次获取缓存如果没有Cache组件会自动创建
3)Cache中查找缓存的内容,使用一个key,默认就是方法的参数
4)key是按照某种策略生成的;默认是使用keyGenerator生成的,这里使用自定义配置
5)没有查到缓存就调用目标方法;
6)将目标方法返回的结果,放进缓存中 Cacheable 注解属性
cacheNames/value:指定方法返回结果使用的缓存组件的名字,可以指定多个缓存
key:缓存数据使用的key
key/keyGenerator:key的生成器,可以自定义
cacheManager:指定缓存管理器
cacheResolver:指定缓存解析器
condition:指定符合条件的数据才缓存
unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存
sync:是否使用异步模式

4、@CacheEvict

清除缓存

CacheEvict:缓存清除
key:指定要清除的数据
allEntries = true:指定清除这个缓存中所有的数据
beforeInvocation = false:方法之前执行清除缓存,出现异常不执行
beforeInvocation = true:代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除

5、@CachePut

保证方法被调用,又希望结果被缓存。

与@Cacheable区别在于是否每次都调用方法,常用于更新,写入

CachePut:执行方法且缓存方法执行的结果
修改了数据库的某个数据,同时更新缓存;
执行流程
1)先调用目标方法
2)然后将目标方法的结果缓存起来

6、@EnableCaching

开启基于注解的缓存

7、keyGenerator

缓存数据时key生成策略

8、@CacheConfig

统一配置本类的缓存注解的属性

三、与SpringBoot2.0整合

1、核心依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、Cache缓存配置

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
@Configuration
public class CacheConfig {
/**
* 自定义 Cache 的 key 生成器
*/
@Bean("oneKeyGenerator")
public KeyGenerator getKeyGenerator (){
return new KeyGenerator() {
@Override
public Object generate(Object obj, Method method, Object... objects) {
return "KeyGenerator:"+method.getName();
}
} ;
}
}

3、启动类注解开启Cache

@EnableCaching            // 开启Cache 缓存注解
@SpringBootApplication
public class CacheApplication {
public static void main(String[] args) {
SpringApplication.run(CacheApplication.class,args) ;
}
}

4、Cache注解使用代码

1)封装增删改查接口

import com.boot.cache.entity.User;
public interface UserService {
// 增、改、查、删
User addUser (User user) ;
User updateUser (Integer id) ;
User selectUser (Integer id) ;
void deleteUser (Integer id);
}

2)Cache注解使用案例

import com.boot.cache.entity.User;
import com.boot.cache.service.UserService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
// 使用自定义的key生成策略
// 缓存结果key:addUser::KeyGenerator:addUser
@CachePut(value = "addUser",keyGenerator="oneKeyGenerator")
@Override
public User addUser(User user) {
return user ;
}
// 缓存结果key:updateUser::2
@CachePut(value = "updateUser",key = "#result.id")
@Override
public User updateUser(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("smile");
return user;
}
// 缓存结果key: selectUser::3
@Cacheable(cacheNames = "selectUser",key = "#id")
@Override
public User selectUser(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("cicadaSmile");
return user;
}
// 删除指定key: selectUser::3
@CacheEvict(value = "selectUser",key = "#id",beforeInvocation = true)
@Override
public void deleteUser(Integer id) { }
}

5、测试代码块

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CacheApplication.class)
public class CacheTest {
@Resource
private UserService userService ;
// 分别测试:增、改、查、删,四个方法
@Test
public void testAdd (){
User user = new User() ;
user.setId(1);
user.setName("cicada");
userService.addUser(user) ;
}
@Test
public void testUpdate (){
userService.updateUser(2) ;
}
@Test
public void testSelect (){
userService.selectUser(3) ;
}
@Test
public void testDelete (){
userService.deleteUser(3) ;
}
}

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/spring-boot-base
GitEE·地址
https://gitee.com/cicadasmile/spring-boot-base

SpringBoot2.0 基础案例(13):基于Cache注解模式,管理Redis缓存的更多相关文章

  1. SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.事务管理简介 1.事务基本概念 一组业务操作ABCD,要么全部 ...

  2. SpringBoot2.0 基础案例(14):基于Yml配置方式,实现文件上传逻辑

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.文件上传 文件上传是项目开发中一个很常用的功能,常见的如头像上 ...

  3. SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口

    一.SpringBoot 框架的特点 1.SpringBoot2.0 特点 1)SpringBoot继承了Spring优秀的基因,上手难度小 2)简化配置,提供各种默认配置来简化项目配置 3)内嵌式容 ...

  4. SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件

    一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...

  5. SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面

    一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Login ...

  6. SpringBoot2.0 基础案例(03):配置系统全局异常映射处理

    一.异常分类 这里的异常分类从系统处理异常的角度看,主要分类两类:业务异常和系统异常. 1.业务异常 业务异常主要是一些可预见性异常,处理业务异常,用来提示用户的操作,提高系统的可操作性. 常见的业务 ...

  7. SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.Actuator简介 1.监控组件作用 在生产环境中,需要实时 ...

  8. SpringBoot2.0 基础案例(15):配置MongoDB数据库,实现增删改查逻辑

    本文源码:GitHub·点这里 || GitEE·点这里 一.NoSQL简介 1.NoSQL 概念 NoSQL( Not Only SQL ),意即"不仅仅是SQL".对不同于传统 ...

  9. SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式

    一.定时任务 1.基本概念 按照指定时间执行的程序. 2.使用场景 数据分析 数据清理 系统服务监控 二.同步和异步 1.基本概念 同步调用 程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执 ...

随机推荐

  1. 解决ubuntu12.04下安装gitlabError Compiling CSS asset的错误以及401资源错误

    安装过程 https://www.gitlab.com.cn/installation/#ubuntu 解决过程 12.04ubuntu坑太多 解决有用的链接如下 https://blog.csdn. ...

  2. 怎么样写一个能告诉你npm包名字是否被占用的工具

    事情是这样的: 因为我经常会写一些npm包,但是有时候我写完一个包,npm publish 的时候却被提示说包名字被占用了,要不就改名字,要不就加scope,很无奈.npm 命令行可以通过 npm v ...

  3. 常见的CSS命名

    1:header(头部)logo  topbar lang search topmenu banner nav headbox active(活动的) selectselectTop selectLi ...

  4. POJ3450 Corporate Identity —— 后缀数组 最长公共子序列

    题目链接:https://vjudge.net/problem/POJ-3450 Corporate Identity Time Limit: 3000MS   Memory Limit: 65536 ...

  5. Spring Boot2.0之自定义参数

    自定义参数,把不同环境的配置放到配置文件中去. 不同环境,如何区分配置文件信息,自定义配置文件信息 比如在 application.properties定义个参数 name=toov5 Spring ...

  6. c语言学习的第13天2

    #include <stdio.h> #include <malloc.h> void f(int **q) { *q=(int *)malloc(sizeof(int)); ...

  7. JQuery添加删除标签

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <script src= ...

  8. UVALive - 7831 :ACM Tax (主席树求树路径上中位数:LCA+主席树)

    题意:给定一棵带权树,Q次询问,每次询问路径上的中位数. 思路:中位数分边数奇偶考虑,当当边数为num=奇时,结果就算路径第num/2+1大,用主席树做即可... (做了几道比较难的主席树,都wa了. ...

  9. 1066 Bash 游戏

    传送门 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1 ...

  10. 关于SetTimer间隔小于OmTimer执行时间的问题

    如果SetTimer的时间间隔为t,其响应事件OnTimer代码执行一遍的时间为T,且T>t.这样,一次未执行完毕,下一次定时到,这时候程序会如何执行? 可能的情况:1.丢弃还未执行的代码,开始 ...