文章目录

  • 1. 引入缓存依赖
  • 2. application.properties 配置
  • 3. 准备基本的Controller、Service代码
  • 4. @Cacheable注解
    • 4.1 cacheNames和value
    • 4.2 key 和 keyGenerator
    • 4.3 cacheManager 和 cacheResolver
    • 4.4 sync
    • 4.5 condition
    • 4.6 unless

1. 引入缓存依赖

     <!----><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!--这边用的是Redis缓存,所以加上这个依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2. application.properties 配置

spring:cache:type: redisredis:database: 5host: 192.168.25.129port: 6379password: 123456

3. 准备基本的Controller、Service代码

public interface RedisService {String getString(String name);
}
@Service
public class RedisServiceImpl implements RedisService {@Overridepublic String getString(String name) {return "hello " + name;}
}
@RestController
@RequestMapping("/redis")
public class RedisController {@Autowiredprivate RedisService redisService;@RequestMapping("/getString1")public String getString1(@RequestParam String name){return redisService.getString(name);}
}

4. @Cacheable注解

4.1 cacheNames和value

指定缓存的名字,可以通过数组的方式指定多个缓存。

    @AliasFor("cacheNames")String[] value() default {};@AliasFor("value")String[] cacheNames() default {};

修改前面的代码,在ServiceImpl的方法上,加上@Cacheable注解并指定value属性

    @Override@Cacheable(value = {"REDIS:GETSTRING1"})public String getString(String name) {return "hello " + name;}

运行SpringBoot程序,在浏览器输入 http://localhost:99/redis/getString1?name=fuhb,然后查看Redis缓存确认是否生成对应的key

127.0.0.1:6379[5]> KEYS *
1) "REDIS:GETSTRING1::fuhb"

由此可见,默认会以 value + 参数的格式生成 Redis Key。

如果是多个参数的情况下,Redis Key会是什么格式呢?

    @RequestMapping("/getString2")public String getString2(@RequestParam String name){return redisService.getString(name, "test");}
    @Override@Cacheable(value = {"REDIS:GETSTRING2"})public String getString(String name, String tag) {return tag + " " + name;}

同样的,在浏览器输入 http://localhost:99/redis/getString2?name=fuhb,再查看Redis Key信息

127.0.0.1:6379[5]> KEYS *
1) "REDIS:GETSTRING2::SimpleKey [fuhb,test]"
2) "REDIS:GETSTRING1::fuhb"

由此可见,参数以 SimpleKey [参数拼接] 的格式进行组合。所以,接下来讲一下 key 和 keyGenerator 属性的使用

4.2 key 和 keyGenerator

keyGenerator

SpringBoot默认使用的是SimpleKeyGenerator生成key,其生成规则如下:

  • 当参数为空时,返回空
  • 当参数只有一个时,返回第一个参数的值
  • 当参数大于一个时,返回SimpleKey对象,其序列化格式上面讲过了,代码比较简单
    public String toString() {return this.getClass().getSimpleName() + " [" + StringUtils.arrayToCommaDelimitedString(this.params) + "]";}

如果需要自定义KeyGenerator,可以参考这篇文章:@Cacheable自定义KeyGenerator

key

相较于keyGenerator,官方更推荐直接显示地指定key

    @Override@Cacheable(value = {"REDIS:GETSTRING3"}, key = "#tag + #name")public String getString4(String tag, String name) {return tag + " " + name;}

或者用这种写法,p0、p1来替代参数名

    @Override@Cacheable(value = {"REDIS:GETSTRING4"}, key = "#p0 + #p1")public String getString4(String tag, String name) {return tag + " " + name;}

key 和 keyGenerator 参数是互斥的,不能同时使用

4.3 cacheManager 和 cacheResolver

CacheManager,缓存管理器是用来管理(检索)一类缓存的。通常来讲,缓存管理器是与缓存组件类型相关联的。我们知道,spring 缓存抽象的目的是为使用不同缓存组件类型提供统一的访问接口,以向开发者屏蔽各种缓存组件的差异性。那么 CacheManager 就是承担了这种屏蔽的功能。spring 为其支持的每一种缓存的组件类型提供了一个默认的 manager,如:RedisCacheManager 管理 redis 相关的缓存的检索、EhCacheManager 管理 ehCache 相关的缓等。

CacheResolver,缓存解析器是用来管理缓存管理器的,CacheResolver 保持一个 cacheManager 的引用,并通过它来检索缓存。CacheResolver 与 CacheManager 的关系有点类似于 KeyGenerator 跟 key。spring 默认提供了一个 SimpleCacheResolver,开发者可以自定义并通过 @Bean 来注入自定义的解析器,以实现更灵活的检索。

大多数情况下,我们的系统只会配置一种缓存,所以我们并不需要显式指定 cacheManager 或者 cacheResolver。但是 spring 允许我们的系统同时配置多种缓存组件,这种情况下,我们需要指定。指定的方式是使用 @Cacheable 的 cacheManager 或者 cacheResolver 参数。

4.4 sync

sync=true表示同步,也就是缓存的入口将被锁住,直到上一个线程的操作完成,可以避免缓存击穿的问题。默认情况是false,也就是异步访问,初始状态下缓存不存在,如果有大量的线程同时访问,会因为没有缓存而对DB造成较大压力。

4.5 condition

缓存的条件,只有当condition返回结果为true才使用缓存。该配置支持SpEL表达式,也可以使用result表示取返回值

如下例子,只有当name的值等于admin时,才会构造并使用缓存

    @Override@Cacheable(value = {"REDIS:GETSTRING5"}, key = "#p0 + #p1", condition = "#name == 'admin'")public String getString5(String tag, String name) {return tag + " " + name;}

4.6 unless

不使用缓存的条件,跟上面的condition相反

如下例子,当name的值等于admin时不使用缓存

    @Override@Cacheable(value = {"REDIS:GETSTRING6"}, key = "#p0 + #p1", unless = "#name == 'admin'")public String getString6(String tag, String name) {return tag + " " + name;}

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

  1. SpringBoot @Cacheable缓存入门程序

    导语 在之前的博客中分享了关于SpringBoot缓存的一些基本的概念,在这篇博客中提供一个小小的入门的实例,通过这个实例可以更好的了解关于SpringBoot缓存有关的知识点.   首先既然是缓存的 ...

  2. @Cacheable缓存注解使用

    目录 1.1 概述 1.2 @Cacheable使用 1.3 整合Redisson缓存 1.4 整合Guava本地缓存 从spring3.1开始,Spring引入了对Cache的支持.其使用方法和原理 ...

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

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

  4. SpringBoot的Cacheable缓存入门

    因为工作需要,最近开始学习SpringBoot.要使用缓存,就搜索了下SpringBoot的缓存方案,有自带的ConcurrentLinkedHashMap,还有主流的Guava.Caffeine.E ...

  5. 【日常】SpringBoot缓存注解器及整合redis实现(附近期一些python零碎的内容)

    序言 似乎灵感枯竭了,完全不知道该写些什么东西,非常的痛苦,决定走读博这条路之后就失去了很多乐趣,总是想应该积累更多的论文和相关项目代码量,但是效率却总是很低,需要应付课程与考试,一篇paper的阅读 ...

  6. SpringBoot缓存注解的使用

    作者平台: | CSDN:blog.csdn.net/qq\_4115394- | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- ...

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

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

  8. SpringBoot中通过自定义缓存注解(AOP切面拦截)实现数据库数据缓存到Redis

    场景 若依前后端分离版本地搭建开发环境并运行项目的教程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 基于上 ...

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

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

最新文章

  1. 编程之美2.7 最大公约数,最小公倍数
  2. 全网独发gensim中similarities.Similarity用法
  3. leetcode算法题--会议室★★
  4. 岗位理解_当面试官问求职者对应聘岗位的理解情况
  5. 错误:unrecognized command line option “-std=c++11”
  6. js 如何去除字符两端的引号
  7. LintCode 183. 木材加工(二分查找)
  8. Ampere 收购 OnSpecta,加速对云原生应用程序的 AI 推理
  9. what's new in vs 2005
  10. AdGuard广告拦截插件V3.6.6
  11. Minio 报错bucket name does not follow Amazon S3 standards
  12. 有了 Git 这个操作,我再也不怕代码混乱了!
  13. ubuntu安装jdk全过程-转
  14. js获取某节点的特定父节点
  15. 蓝桥杯java 大纲,2019 第十届蓝桥杯Java省赛B组个人总结
  16. 物联网发展 制定技术标准才能更好监管
  17. 红米AirDots无线蓝牙耳机连接win10笔记本
  18. 计算机启用远程桌面连接失败,开启局域网远程桌面连接不上怎么办
  19. 最新影视小程序源码去授权版免费下载
  20. 【游戏开发题库】使用Unity制作Unity题库,支持题目录入和刷题(面试 | 笔试 | 自制题库 | 从基础到高级)

热门文章

  1. 为IDOC创建tRFC连接
  2. 2021年茅台销售现新套路,限价控价没有用?
  3. python mysql股票分析_一颗韭菜的自我修养:用Python分析下股市,练练手
  4. mysql join 算法_【MySQL】之join算法详解
  5. BUUCTF-misc另外一个世界 8个二进制数为一组转ASC码
  6. python反编译工具uncompyle的安装与用法
  7. python调用其他文件的类和函数
  8. Python函数的定义和使用
  9. 如何使用Python创建自己的加密货币
  10. python3 拼接字符串的7种方法