【Spring】Spring @Cacheable 官方学习及demo

news2024/9/25 13:20:44

文章目录

    • 前言
    • @Cacheable 的来源
    • 应用场景
      • 集成Redis的思路
    • 代码及验证
    • 后记

前言

Spring 有很多声明式的编程风格,@Transactional 是,@Cacheable 也是。说起 @Transactional,复杂的事务情况下,这个注解也有局限,需要用到编程式的事务完成需求。同样地,@Cacheable 也是适合简单的缓存场景

@Cacheable 的来源

在这里插入图片描述

  • 来自 Spring Framwork - Integration。
    • Spring Framwork - Integration - Cache 官方reference

    在 Integration 项目中,查了下资料,是受 《Enterprise Integration Patterns 》的启发,内容待研究,本文不提。

  • 沿袭官方的称呼,后文把这个包都称为 Cache Abstraction
    • 相关的注解还有

      • @Cacheable: Triggers cache population. 笔记:方法返回值写入缓存
      • @CacheEvict: Triggers cache eviction. 笔记:清除缓存
      • @CachePut: Updates the cache without interfering with the method execution. 笔记:更新缓存,强调不干扰方法执行
      • @Caching: Regroups multiple cache operations to be applied on a method. 笔记:v支持缓存组合操作
      • @CacheConfig: Shares some common cache-related settings at class-level. 笔记:作用其实跟@RequestMapping差不多
    • 缓存的增删改查的修饰,比如缓存名、缓存的key、缓存的value,都声明为注解参数或者方法返回值

      • cacheNames 笔记:缓存名
      • key 笔记:对应缓存名的key
      • keyGenerator 笔记:更详细的key处理方式
      • cacheManager 笔记:非必填,需要了解这个参数的时候再填
      • cacheResolver 笔记:非必填,需要了解这个参数的时候再填

      摘一个原文,提醒互斥的参数不要同时存在在注解上。
      Similarly to key and keyGenerator, the cacheManager and cacheResolver parameters are mutually exclusive, and an operation specifying both results in an exception, as a custom CacheManager is ignored by the CacheResolver implementation. This is probably not what you expect.

应用场景

类比 @Transactional,无论应用集成的是MySQL、Oracle、PostgreSQL,用该注解都能获得事务支持。
同样的,@Cacheable 等注解,背后可以是简单的 ConcurrentHashMap ,也可以是 Redis.

集成Redis的思路

本质上跟 @Transactional 集成 MySQL 没什么太大区别。注意Spring Boot 项目可以很方便的引入 spring-data-redis

  • spring-data-redis 里面有 cacheManager 的实现类注入到容器中,侧面应证了这个项目支持 Cache Abstraction
  • spring-data-redis 官方文档说明,可选两种驱动实现,这里选Jedis
  • spring-data-redis 官方文档说明,注入符合需求的 bean,这里 JedisConnectionFactory
  • 按照 Cache Abstraction 的规范,注入符合需求的 bean,这里注入 RedisCacheManager
  • @EnableCaching 在启动类启用 Cache Abstraction 支持

代码及验证

github
允许单元测试,注意可以断点的方式确认缓存写入、缓存生效(不调用方法内的逻辑)
在这里插入图片描述

后记

Cache Abstraction 缓存的增删改查,跟着官网,实现起来都很简单。针对只读的数据,提升响应速度,用这个注解可以让代码更清爽。更高级的用法,比如设置TTL,官网也有例子。在使用redis集群的时候,配合 spring-data-redis,限制就稍微多点,目前觉得这个场景下用这个抽象没有安全感。另外,Spring Boot 或是 Spring 的集成还是很有自己的风格的,看看文档,决定配置,把配置bean注入,集成就完成拉。后续从架构的角度学学 《Enterprise Integration Patterns》,窥探一下 Spring Framwork - Integration 背后参考的架构设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

奇安信病毒检测中心 2022年第二季度App收集个人信息检测报告 学习笔记 附下载地址

奇安信 2022年第二季度App收集个人信息检测报告 下载地址 2022年第二季度 APP收集个人信息 检测报告 奇安信 病毒响应中心 研究背景 随着互联网和移动设备的发展,手机已成为人人都拥有的设备,其中各式各样的APP更是丰富了人们的生活,从社交…

现在考系统集成项目管理工程师有用吗?

有用! 现在考系统集成项目管理工程师还是挺有用的哈,虽然它资质评定国务院取消了,但它是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试,并且是职业资格考试、职称资格考试和水平考试。 系统集成项目管理工程师…

sql-labs靶场环境搭建及搭建过程遇到的问题

sql-labs是github上的一个开源项目,通过闯关的方式训练自己的SQL注入。 下载php-study 进入官网 php-study 下载sql-labs 进入github sql-labs 将sql-labs下载到php-study的WWW\目录下,解压。 配置sql-llibs 记事本打开sqli-labs-master\sql-conn…

用python采集四大电商平台商品数据进行对比

前言 大家早好、午好、晚好吖 ❤ ~ 环境介绍: python 3.8 越稳定越好 pycharm 2021专业版 一、考拉 模块使用: requests >>> pip install requests parsel >>> pip install parsel 代码展示 导入模块 # import 导入模块 import requests # 第三方…

这届黑客不讲武德

编者按 腾讯安全2022年典型攻击事件复盘第七期,希望帮助企业深入了解攻击手法和应对措施,完善自身安全防御体系。 本篇讲述了某物流公司遭遇不明黑客攻击,腾讯安全服务团队和客户通力合作,排查溯源,最后揪出黑客的尾…

十、HashMap详解

文章目录小结底层源码框架特点源码详解小结 Map接口的常用实现类:HashMap、Hashtable和Properties.HashMap是Map接口使用频率最高的实现类。HashMap是以 key-val对的方式来存储数据(HashMap$Node类型)key不能重复,但是值可以重复,允许使用null键和null值。如果添加…

Android设计模式详解之组合模式

前言 组合模式也称为部分整体模式,结构型设计模式之一; 定义:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性; 使用场景: 表示对象的部分-整体的层…

屏幕录制为什么没声音?检查这2项,轻松解决

相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系…

amCharts 5: Maps 附加组件

amCharts 5: Maps 附加组件 将reverseGeodata设置添加到MapPolygonSeries。如果设置为true,将反转GeoJSON数据中多边形角的方向。 向MapLine添加了新的linechanged事件。 amCharts 5:地图 amCharts:Maps是amCharts:Charts的附加组件。使用它可以将完整的…

Java学习笔记【7】面向对象

⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ 🌀 个人首页:🏠 星空之路Star 🏠 🌀 所属专栏:📖 Java知识点总结 📖 🌀 大家好🤝 我是 👉老孙👈 &…

操作系统期末考试必会题库5——文件管理

1、画出文件系统的层次模型,并描述各层的功能。 2、某文件系统为一级目录,文件的数据一次性写入磁盘,已经写入的文件不可修改,但可以多次创建新文件,请回答: (1) 采用哪种文件物理结构形式更适合&#xff…

hnu计网实验二-网络基础编程实验(JAVA\Python3)

前言:这次实验用的是python语言,但是本人的python也不是很强,所以代码大部分也是借鉴别人的。实验本身还是很有趣的 一、实验目的 通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序&#xf…

Qt编写雷达模拟仿真工具

一、前言 雷达模拟仿真工具,已发布很长一段时间,一直以来没有好好整理该系列文章,在刘哥6.5的极力推荐下,整理出该系列的更加详细细节的文章出来。懒散了很久,也颓废了不少,人啊,感觉不能颓废下…

Python入门小案例: 采集全网表情包图片

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 环境使用: Python 3.8 Pycharm 2021.2版本 模块使用: import requests >>> pip install requests -pip install -i https://pypi.doubanio.com/simple/ requests import re 安装pyt…

Revit中:该扶手的坡度可能与梯段及平台楼梯不平行问题

一、Revit中单独绘制楼梯扶手问题 单独绘制扶手的时候总是会出现梯段及平台上的楼梯不平行,这种情况怎么办? 在正常操作下楼梯会制动生成扶手,但有时候还是回碰到单独绘制扶手的时候然后就会出现这样的些问题,如图1、图2所示。 解决方法&…

(Research)深度迁移学习使循环肿瘤细胞的病变追踪成为可能

Tips: 深度迁移学习使循环肿瘤细胞的病变追踪成为可能 (Nat Commun),原文链接: https://pubmed.ncbi.nlm.nih.gov/36509761/ 摘要: CTC做为液体活检中最重要的一个目标,如果能够对 CTC 进行溯源那么就能够实现肿瘤的早…

mediasoup create/connect WebRtcTransport 流程分析

一. 前言 在这篇博客中我们介绍了 mediasoup-demo 启动流程与信令交互,关键信令包括 getRouterRtpCapabilites,join, createWebRtcTransport, connectWebRtcTransport, produce,本文将介绍 createWebRtcTransport 和 connectRtcTransport 的流…

为远程MySQL数据库配置固定的公网TCP地址【内网穿透】

在上篇文章中, 我们成功实现了在公网环境下远程连接内网MySQL数据库。但由于使用的免费的cpolar内网穿透,其所生成的公网地址为随机临时地址,24小时内会发生变化,对于需要长期远程访问的用户来讲非常不方便。因此,本篇…

华为云CDN加速服务,让企业用户上网“走高速”

如今CDN技术在互联网项目中越来越被广泛应用,虽然大多数人对于CDN并不熟悉,但其实我们的日常生活中的看新闻、看直播、网上购物等,都在无形之中跟CDN息息相关。 华为云CDN是通过部署广泛的节点服务器,将源站内容分发给靠近用户的智…

【修改】对“C语言实现轰炸代码”进行修改和完善

场景: 使用C语言实现“轰炸”效果,就是多条重复表情或信息的发送;使用场景是在QQ上面。 问题描述 1.不兼容,对于VS2022或者其他VS编译器无法实现效果。 2.代码能正常运行但无法弹出窗口进行发信息。 原因分析: 1.不…