本文源码
GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base

一、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() {@Overridepublic 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")@Overridepublic User addUser(User user) {return user ;}// 缓存结果key:updateUser::2@CachePut(value = "updateUser",key = "#result.id")@Overridepublic User updateUser(Integer id) {User user = new User() ;user.setId(id);user.setName("smile");return user;}// 缓存结果key: selectUser::3@Cacheable(cacheNames = "selectUser",key = "#id")@Overridepublic 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)@Overridepublic void deleteUser(Integer id) {}
}

5、测试代码块

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

四、源代码地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base
码云地址:知了一笑
https://gitee.com/cicadasmile/spring-boot-base


SpringBoot2.0 基础案例(13):基于Cache注解模式,管理Redis缓存相关推荐

  1. SpringBoot2.0基础案例分类总结,后续更新计划说明

    一.基础案例 1.基础案例概览 历时一个半月,SpringBoot2.0基础案例的文章基本更新完毕了,基础案例包含了SpringBoot的基础教程,高级应用,日志配置,数据库使用,事务管理等.关于Sp ...

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

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

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

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

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

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

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

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

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

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.NoSQL简介 1.NoSQL 概念 NoSQL( Not O ...

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

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

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

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

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

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

最新文章

  1. Nginx 动静态访问分离
  2. 报错:'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
  3. android 获取相机方向,android – 从相机捕捉图像,导致炸毁方向
  4. mysql 数据库军规_用尽洪荒之力整理的Mysql数据库32条军规(转)
  5. :没有此sdk或暂不支持此sdk模拟_即构SDK7月迭代:新增支持按通道设置延迟模式,大大减少卡顿...
  6. IIS发布可下载文件的站点
  7. 纸的大小图解_纸张的尺寸标准
  8. 12C GDS安装简记
  9. 在Vue中使用svg格式字体图标
  10. 地铁 java_“地铁系统”简易代码
  11. 判断魔方阵c语言程序设计_魔方阵算法及C语言实现
  12. Redis学习之incr命令
  13. android 解锁过程,Android-解锁与刷机(以一加为例)
  14. server取出多个最小值 sql_sql-server
  15. 自动弹窗加qq群教程
  16. CSS3 动画效果
  17. 【招聘推荐】启元世界招聘深度强化学习算法工程师
  18. 在职场中如何保持新鲜感
  19. [从头读历史] 第247节 夏商与西周时期的全面解读
  20. 肿瘤分类与预测(SVM)

热门文章

  1. (操作系统题目题型总结)第五章:设备管理
  2. Linux的system()和popen()差异
  3. Linux多线程Pthread学习小结
  4. Java 时间处理(格式解释、格式化时间、获取当前时间、获取年份、月份等、时间戳转换成时间)
  5. 关于进程资源限制的getrlimit和setrlimit函数(epoll、服务器经常用)
  6. JAVA 枚举类的初步理解
  7. Docker容器的管理
  8. varchar类型字段排序混乱问题
  9. iOS block 用法
  10. 翻译预告 《介绍 GENEVA Beta 1 白皮书》