目录

1.1 概述

1.2 @Cacheable使用

1.3 整合Redisson缓存

1.4 整合Guava本地缓存


从spring3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的。

核心思想

当调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回。所以在使用Spring Cache时要保证缓存的方法对于相同的方法参数要有相同的返回结果。

使用Spring Cache需要做两方面的事:

  • 声明某些方法使用缓存
  • 配置Spring对Cache的支持

与Spring对事务管理的支持一样,Spring对Cache的支持也有基于注解和基于XML配置两种方式。下面我们先来看看基于注解的方式。

1.1 概述

Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。

1.2 @Cacheable使用

ex1:
@Cacheable(cacheNames = CacheConstants.TEST, key = "#args[0]+'_'+#args[1]", unless = "#result == null")ex2:
@Cacheable(value = CacheConstants.TEST, key = "#bean.payType +'_'+ #bean.shopNo",condition = "#result != null && #result.size() != 0", sync = true)public Map<String, String> getHost(Bean bean) {
......
}

字段释义:

value:等同于cacheNames用于指定缓存名称;
key:指定缓存的key,可以使用spel表达式构建
keyGenerator:(需要自己配置对应的bean)指定key的生成策略根据参数生成key,和key互斥
condition:指定缓存生效的条件,对请求参数进行判断

unless:是指定条件下进行缓存,是在返回之后判断是否进行缓存,是对结果进行判断
cacheManager: 指定自定义的缓存管理器(可以详细配置缓存的各种属性,过期时间,序列化方式等,可以指定缓存实现方式,比如整合guava本地缓存或者Redis分布式缓存)

sync:是否同步,true/false。在一个多线程的环境中,某些操作可能被相同的参数并发地调用,这样同一个 value 值可能被多次计算(或多次访问 db),这样就达不到缓存的目的。针对这些可能高并发的操作,我们可以使用 sync 参数来告诉底层的缓存提供者将缓存的入口锁住,这样就只能有一个线程计算操作的结果值,而其它线程需要等待,这样就避免了 n-1 次数据库访问

1.3 整合Redisson缓存

@EnableCaching
@Configuration
public class LocalCacheConfig {@Bean("cacheManager")CacheManager cacheManager(RedissonClient redissonClient) {Map<String, CacheConfig> config = new HashMap<>(4);// 配置失效策略config.put(CacheConstants.TEST, new CacheConfig(3 * 60 * 1000, 2 * 60 * 1000));config.put("ttl3", new CacheConfig(3 * 60 * 1000, 2 * 60 * 1000));config.put("ttl5", new CacheConfig(5 * 60 * 1000, 3 * 60 * 1000));config.put("ttl10", new CacheConfig(10 * 60 * 1000, 5 * 60 * 1000));RedissonSpringCacheManager cacheManager = new RedissonSpringCacheManager(redissonClient, config);// 默认jack序列化cacheManager.setCodec(new JsonJacksonCodec());cacheManager.setAllowNullValues(false);return cacheManager;}
}

1.4 整合Guava本地缓存

@Slf4j
@EnableCaching
@Configuration
public class LocalCacheConfig {@Bean("cacheManager")public CacheManager cacheManager() {SimpleCacheManager manager = new SimpleCacheManager();List<Cache> list = new ArrayList();GuavaCache testCache = new GuavaCache(CacheConstants.TEST,CacheBuilder.newBuilder().concurrencyLevel(500).recordStats().maximumSize(1024).expireAfterWrite(5, TimeUnit.MINUTES).build());list.add(testCache);manager.setCaches(list);return manager;}
}

@Cacheable缓存注解使用相关推荐

  1. SpringBoot @Cacheable缓存注解的使用

    文章目录 1. 引入缓存依赖 2. application.properties 配置 3. 准备基本的Controller.Service代码 4. @Cacheable注解 4.1 cacheNa ...

  2. Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常

    Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常 参考文章: (1)Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入 ...

  3. 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓 ...

  4. 2021-10-12Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  5. cacheable 表达式_Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  6. cacheable更新_Spring之缓存注解@Cacheable

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  7. cacheable更新_详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓 ...

  8. 三十七、缓存注解@Cacheable、@CacheEvict、@CachePut详解

    #        缓存注解@Cacheable.@CacheEvict.@CachePut详解 ##一.@Cacheable用法详解 ###1.用在哪里?     用在方法或者类上. ###2.这两种 ...

  9. spring缓存注解@Cacheable和@CacheEvict,设置过期时间和批量模糊删除

    spring缓存注解@Cacheable和@CacheEvict,设置过期时间和批量模糊删除 配置 CacheManager 类 key前缀配置 RedisCache配置 RedisCache 模糊匹 ...

最新文章

  1. 微信出现“已停止访问该网页”或“关于潜在的违法或违规内容”怎么办?如何获取被屏蔽的网页的网址?...
  2. Datawhale入选DataFountain优秀组织
  3. 闲诗一首:《扬州即行》
  4. mysql查询日期内的所有日期代码
  5. 武汉python培训哪一家好一些-武汉Python培训机构哪家好?要怎么选才靠谱?
  6. OpenCASCADE:OCCT应用框架OCAF之TObj模型对象
  7. jquery中Live方法不可用,Jquery中Live方法失效
  8. 数据结构与算法:排序算法的稳定性以及各性能比较python实现
  9. Codeforces Beta Round #19 D. Points
  10. linux中usb设备名,Linux 中识别 USB 设备名字的 4 种方法
  11. 20个很有帮助的 Web 前端开发教程
  12. Java中的toString()方法
  13. namenode和datanode的功能分别是什么_海德堡印刷机电路板分别是什么功能
  14. iOS对sqlite3进行封装
  15. android 广告平台—杀毒软件是如何知道是否有广告的
  16. AIX 操作系统安全配置指南
  17. 货币金融学(1): 货币/ 信用/ 金融机构
  18. 201771010101 白玛次仁 《2018面向对象程序设计(Java)》第十七周学习总结
  19. 非酒精性脂肪性肝炎潜在治疗靶点及药物研究进展
  20. LPC2294对片外EEPROM(24C04)进行读写操作,如何确定24C02EEPROM地址

热门文章

  1. 如何快速清洗空调扇(水冷式电风扇)(图文教程)
  2. CSDN博客字体样式、字体大小、字体颜色、首行缩进调节
  3. PDM与Excel利用VB脚本进行互导
  4. Go语言开发工具 LiteIDE X27 发布
  5. 基于opencv实现人脸识别及签到系统
  6. 【算法题】1927. 求和游戏
  7. 错误: 找不到符号 java
  8. 证券业上云内参: 深圳证券信息
  9. Java抽象类(abstract)
  10. mfc利用SQL、DAO调用access数据库