从 0 学习 Spring 缓存数据

Spring Cache+Redis实现缓存数据的一致性 Spring Cache是一个非常优秀的组件。来自Spring3.1,提供了类似于@Transactional注解事务的注解Cachae支持,且提供了Cache抽象,方便切换各种底层Cache(如Redis) 使用Spirng Cache的好处: 提供基本的Cache抽象,方便切换各种底层Cache; 通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的的代码就可以完成 提供事务回滚时也可以自动回滚缓存 支持比较复杂的缓存逻辑 项目集成Spring Cac 阅读详情

前言

昨天在开发业务时,打算加入缓存层来提高系统响应速度。查找了一些资料,发现 Spring 的缓存功能十分强大!只需要添加少量的代码,就可以轻松缓存方法所返回的对象。这篇文章通过描述一个实际使用例子,介绍 Spring Cache 的使用限制以及注意事项。

环境准备

  • Redis 5+
  • JDK 1.8+
  • Gradle 6+
  • 一款你喜爱的 IDE

实践过程

添加依赖

打开 build.gradle 文件,添加 Spring Cache 依赖。

implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

创建模型

@Data
@AllArgsConstructor
public class Post implements Serializable {

    private Long id;

    private String title;

    private String content;
}

PS:这里使用到了 Lombok 插件,如果不熟悉可先查询相关资料进行了解。

创建模型仓库

public interface PostRepository {

    Post getById(Long id);

}
@Component
public class PostRepositoryImpl implements PostRepository {
    @Override
    public Post getById(Long id) {
        // 模拟查询时间
        simulateSlowService();
        return new Post(100L, "title", "content");
    }

    private void simulateSlowService() {
        try {
            Long time = 3000L;
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

编写控制器

@RestController
public class PostController {

    private final PostRepository postRepository;

    public PostController(PostRepository postRepository) {
        this.postRepository = postRepository;
    }

    @GetMapping("posts/{id}")
    public Post getPostById(@PathVariable("id") Long id) {
        return postRepository.getById(id);
    }
}

针对一些不容易被修改的资源,如果每次都需要到持久化数据库中进行查询,无疑是十分浪费的,体验也差,下面我们使用 Spring Cache 来改进一波。

使用 Spring Cache

@EnableCaching
@SpringBootApplication
public class CacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class, args);
    }
}

添加 @EnableCaching 注解启动 Spring Cache。

spring:
  cache:
    type: redis
  redis:
    host: 127.0.0.1
    port: 6379

这里用 Redis 作为缓存引擎,如果小伙伴想用其他引擎,可自行查阅文档进行配置。

@RestController
public class PostController {

    private final PostRepository postRepository;

    public PostController(PostRepository postRepository) {
        this.postRepository = postRepository;
    }

    @Cacheable(cacheNames = "getPostById", key = "#id")
    @GetMapping("posts/{id}")
    public Post getPostById(@PathVariable("id") Long id) {
        return postRepository.getById(id);
    }
}

使用 @Cacheable 注解 getPostById 方法,使用了 cacheNames 和 key 参数。这里先不展开说,下面会集中梳理几种注解以及它们的参数意义。

Spring Cache 注解

Spring Cache 常用的 5 个注解,分别是:

  • @EnableCaching
  • @Cacheable
  • @CachePut
  • @CacheEvict
  • @CacheConfig

@EnableCaching

在启动类添加 @EnableCaching 注解让系统开启缓存功能。

@Cacheable

功能是开启缓存,可以标记在类上或者是方法上。在调用方法时,会先从缓存中获取结果,若不存在再执行方法。主要参数包括 cacheNames、key、condition 和 unless 等。

  • cacheNames:用于指定缓存存储的集合名,必须填写。
  • key:缓存对象存储在集合中的 key 值,缺省按照函数的所有参数组合作为 key 值。
  • condition:缓存对象的条件,需使用 SpEL 表达式。只有满足表达式条件的内容才会被缓存。
  • unless:缓存对象的条件,需使用 SpEL 表达式。它不同于 condition 参数的地方在于它的判断时机,该条件是在函数被调用之后才做判断的,所以它可以通过对返回对象进行判断。
  • keyGenerator:用于指定 key 生成器。若需要自定义 key 生成器,需要实现 KeyGenerator 接口,并使用该参数来指定。
  • cacheManager:用于指定使用哪个缓存管理器。
  • cacheResolver:用于指定使用那个缓存解析器。

@CachePut

针对方法配置,与 @Cacheable 不同的地方在于它每次都会触发真实方法的调用。简单来说就是更新缓存数据。主要参数和 @Cacheable 一致。

@CacheEvict

针对方法配置,用来从缓存中移除相应数据。除了与 @Cacheable 相同的参数以外,还有 allEntries 和 beforeInvocation。

  • allEntries 非必须,默认为 false。当为 true 时,会移除所有数据。
  • beforeInvocation 非必须,默认为 false,会在调用方法之后移除数据。当为 true 时,会在调用方法之前移除数据。

@CacheConfig

该注解是一个类级注解,可以让类下面的方法共享 cacheNames、keyGenerator、cacheManager 和 cacheResolver 参数。

自定义 cacheNames

这里是为了让我们的缓存注解支持自定义 TTL 失效时间,类似下面这种效果。

// 3600 秒后缓存集合自动过期
@Cacheable(cacheNames = "getPostById#3600", key = "#id")

为了实现这种效果,我们创建一个 CustomRedisCacheManager 自定义类,如下所示。

public class CustomRedisCacheManager extends RedisCacheManager {
    public CustomRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }

    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {

        String[] array = StringUtils.delimitedListToStringArray(name, "#");

        name = array[0];

        if (array.length > 1) {
            long ttl = Long.parseLong(array[1]);
            cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl));
        }

        return super.createRedisCache(name, cacheConfig);
    }
}

使用自定义 CustomRedisCacheManager 配置 CacheConfig。

public class CacheConfig extends CachingConfigurerSupport {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private Integer redisPort;

    @Value("${spring.redis.database}")
    private Integer redisDatabase;

    @Override
    @Bean
    public CacheManager cacheManager() {
        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(1))
                .computePrefixWith(cacheName -> "caching:" + cacheName);

        return new CustomRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory()), defaultCacheConfig);
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(redisHost);
        configuration.setPort(redisPort);
        configuration.setDatabase(redisDatabase);
        return new LettuceConnectionFactory(configuration);
    }
}

总结

本文主要介绍了 Spring Cache 的基本使用方式和常用注解。后续文章准备深入了解其底层原理。

贝叶斯神经网络(Bayesian Neural Network) 最近在研究贝叶斯神经网络,一些概念一直搞不清楚,这里整理一下相关内容,方便以后查阅。 阅读详情

相关推荐

RAG优化实战:微调Embedding模型提升检索精度全流程

在构建基于大语言模型(LLM)的问答系统时,检索增强生成(RAG)架构是关键技术路线。其核心原理在于,通过Embedding模型将文本转换为高维向量,并在向量空间中进行语义相似度计算,从而实现精准检索。这项技术的核心价值在于,它能有效利用专属知识库,为大模型提供准确的上下文信息,从而减少“幻觉”并提升答案的专业性与时效性。然而,通用Embedding模型在面对医疗、法律、金融等垂直领域的专业术语和行话时,往往存在语义理解偏差,导致检索不准,成为RAG系统的关键瓶颈。为解决此问题,微调(Fine-tuning

weixin_34088583的博客 502

【SpringBoot】最通俗易懂缓存机制学习(二)

springboot缓存机制学习

weixin_47418550的博客 1716

从FrSky到TBS:深度解析航模2.4G遥控协议江湖史(附ELRS高频头改装指南)

本文深度解析了航模2.4G遥控协议的技术演进史,从FrSky ACCST的兴衰到TBS Crossfire的崛起,再到开源协议ExpressLRS的革命性突破。文章不仅对比了各协议在延迟、距离与抗干扰能力上的技术内核,还提供了为多协议遥控器加装TBS Crossfire高频头的实战改装指南,帮助玩家打通协议壁垒,提升飞行体验。

weixin_29193259的博客 739

Spring Cache缓存注解

缓存名是必须提供的,可以使用引号、Value或者cacheNames属性来定义名称。下面的定义展示了users缓存的声明及其注解的使用: @Cacheable(“users”) //Spring 3.x @Cacheable(value = “users”) //Spring 从4.0开始新增了value别名cacheNames比value更达意,推荐使用 @Cacheable(cacheNames = “users”) 键生成器 缓存的本质就是键/值对集合。在默认情况下,缓存抽象使用(方法签名及参数值)作

weixin_45032957的博客 1469

OLED的字模提取(保姆级)---基于PCtoLCD2013

做为一个刚刚开始接触编程不久的白菜,这个OLED想做一个信息显示,可是商家给我的例程里就是88,816两种字体的格式,我的屏幕是0.91寸的8*16的字体显示上感觉特别丢丢儿小,我就想整个大的,哎,只怪直接学习习惯不好,总是学一半,绕了好大一圈,才搞好,想写一篇博客,时刻提醒踏实学习,第一次写博客,小白一枚,勿喷。。 OLED屏幕驱动程序功能 我们对Markdown编辑器进行了一些功能拓展与语法支...

qq_44886611的博客 7782

两相变频交错PFC实战:从论文理论到PSIM仿真的完整避坑指南

本文详细解析了两相变频交错PFC技术从理论到PSIM仿真的完整实现过程,特别针对CRM模式下的BOOST PFC设计挑战提供实用解决方案。涵盖周期值比较法与RS触发器法的对比实施、PSIM仿真中的过零处理与收敛性优化等核心问题,并给出硬件实现的进阶建议,助力工程师高效完成高功率密度PFC设计。

weixin_30632089的博客 423

spring boot2 (28)-cache缓存

数据库的数据是存储在硬盘上的,频繁访问性能较低。而缓存数据存储在内存中,访问性能比硬盘快了一个数量级。如果将一些需要频繁查询的热数据放到缓存中,可以大大减轻数据库的访问压力。pom.xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>sprin...

JAVA博客 8764

学习海康VisionMaster之顶点检测

2:应用场景:海康VisionMaster的顶点检测功能在工业视觉检测中具有广泛的应用场景,尤其在精密制造、电子元件检测和机械加工等领域,其通过高精度定位物体的关键点(如角点、交点或边缘顶点)来实现自动化测量与质量控制。基本参数这里就是画ROI,设定跟踪参数和之前的工具是一样的方法,这里画的方向需要注意,如下图所示,边缘的扫描方向正好对应需要查找的边缘点。一个不是很规则的物体需要检测一个凸台的顶角坐标,其实靠边缘与边缘交点是不太稳定的,如下图所示,边缘很短,很容易产生误抓边缘。1:什么是顶点检测?

yuhouxiyang的专栏 1527

@Cacheable注解属性介绍

Spring Boot 学习笔记(三十三):       在 @Cacheable 注解的使用中,共有 9 个属性供我们来使用,这 9 个属性分别是:value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless、sync。接下来我们就分别来介绍一下它的使用。 1.value/ca...

扛麻袋的少年的博客 3万+

8、鼠疫流行过程的计算机建模介绍

本博文介绍了一种基于概率细胞自动机和蒙特卡罗方法的计算机模型,用于模拟由大沙鼠传播的鼠疫流行过程。结合GIS和遥感技术,该模型能够分析鼠疫在不同聚居地类型和季节变化下的传播特征,揭示了群落密度、分布及流行接触率对鼠疫传播的影响。研究还验证了模型与自然流行过程的一致性,并探讨了鼠疫在宿主数量低谷时的持续机制。模型为鼠疫防控和流行病研究提供了定量分析工具。

x2y3z4a5b的博客 107

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧!

努力前行,总会成为自己心中的那道光 4万+

Spring Cache-缓存自定义配置

1.Cacheable指定自定义属性 /** * 查询所有1级分类 * @Cacheable代表当前方法的结果需要缓存,若缓存中有则方法不会调用,若缓存中没有会调用方法并将结果放入缓存 * 缓存默认行为: * a.若缓存中有则方法不会被调用 * b.key默认自动生成,缓存的名字::SimpleKey [] (自动生成的key值) * c.缓存的value值,默认使用jdk序列化机制,将序列化后的数据存到redis * d.默认ttl时间为-1 * @return */ @Cache

小生不才的博客 4562

【芯片设计- RTL 数字逻辑设计入门 番外篇6 -- 术语 Tile 介绍】

在系统级芯片(System on Chip, SoC)设计中,“tile” 是一个可以指代不同概念的术语,但通常它指的是芯片上的一个独立的功能单元或核心。一个 tile 可以包含一个或多个处理器核心、缓存、内存控制器、输入输出设备、外设接口或其他功能模块。在 SoC 上,多个 tile 可以被组合和连接起来,以形成一个完整的系统。

CodingCos的博客 3082

boot spring 对参数检测_从 0 学习 Spring 缓存数据

前言昨天在开发业务时,打算加入缓存层来提高系统响应速度。查找了一些资料,发现 Spring 的缓存功能十分强大!只需要添加少量的代码,就可以轻松缓存方法所返回的对象。这篇文章通过描述一个实际使用例子,介绍 Spring Cache 的使用限制以及注意事项。环境准备Redis 5+JDK 1.8+Gradle 6+一款你喜爱的 IDE实践过程添加依赖打开 build.gradle 文件,添加 Spr...

weixin_39582569的博客 69

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

data spring 指定时区_从 0 学习 Spring 缓存数据

前言昨天在开发业务时,打算加入缓存层来提高系统响应速度。查找了一些资料,发现 Spring 的缓存功能十分强大!只需要添加少量的代码,就可以轻松缓存方法所返回的对象。这篇文章通过描述一个实际使用例子,介绍 Spring Cache 的使用限制以及注意事项。环境准备Redis 5+JDK 1.8+Gradle 6+一款你喜爱的 IDE实践过程添加依赖打开 build.gradle 文件,添...

weixin_39788740的博客 79

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Boot中缓存数据的流程及数据同步处理方案

Spring Boot通过Spring Cache抽象层提供了对缓存的支持,可以方便地集成多种缓存实现,如Ehcache、Redis、Caffeine等。Spring Cache抽象层的主要优点是提供了一致的缓存操作接口,使得开发者可以在不改变业务逻辑的情况下切换不同的缓存实现。Spring Boot提供了强大的缓存支持,可以方便地在应用中集成各种缓存解决方案。通过合理使用缓存注解和配置,可以显著提升系统的性能。

xycxycooo的博客 796

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

springboot 使用spring cache缓存 和 缓存数据落地到redis

springboot工程已经和方便的支持缓存cache的使用了,几个注解就可以搞定。本文主要实现了:使用spring的 cache缓存功能,和将缓存数据落地到redis中

向上程序员 1824

Spring Cache + Caffeine使用中的坑——缓存数据修改导致缓存Key失效问题

问题描述 今天在项目中突然碰到一个问题:使用的缓存是Spring Cache + Caffeine,缓存在执行两次后,突然Key中定义的条件失效。代码如下: public class CodeOutputService { // 注入当前类的对象 @Resources private CodeOutputService codeOutputService; ...

蛋壳城堡 9966

三、Spring Cache + Redis 缓存数据

自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,方便切换各种底层Cache(如:redis)因为缓存也是公共使用,所有的service模块都有可能使用缓存,所以我们把依赖与部分配置加在service-util模块,这样其他service模块都可以使用了。使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。2,通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;

qq_43102730的博客 1436

Spring学习笔记之缓存数据

缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的。在本章中,我们将会了解到Spring的缓存抽象。尽管Spring自身并没有实现缓存解决方案,但是它对缓存功能提供了声明式的支持,能够与多种流行的缓存实现进行集成。

薛小强Forever 892

【spring boot】2.0 配置@cacheable 自定义序列化方式 缓存数据到redis

一·背景描述  spring 的  @cacheable 已成为我们比较常用的缓存数据的方式,但是把非String对象缓存到redis后在使用RedisDesktopManager等软件查看缓存的数据的时候 展示的是HEX 数据,观察起来比较不方便,所以我们这里自定义了FastJsonRedisSerializer 序列化对象后缓存到redis,可以更 方便的观察缓存数据。二·引入jar包<...

而浮生若梦,为欢几何 1万+

java代码Redis如何缓存数据一文交代清楚

在Java中,可以通过使用Redis进行数据缓存。Redis是一个内存数据存储系统,它可以用作缓存服务器,用于存储和检索数据。下面是一些Java代码示例,展示了如何使用Redis进行数据缓存。在上面的代码中,我们创建了一个名为RedisCache的类,该类包含了与Redis服务器建立连接和断开连接的方法。方法,你可以通过键来获取在Redis中缓存的值。在使用完Redis后,需要关闭Redis连接,释放资源。方法,你可以将指定的键值对缓存到Redis中。方法,你可以通过键来删除Redis中缓存的值。

我的笔记 1160

Spring Cache + Redis 缓存数据

Spring Cache 是一个非常优秀的缓存组件。自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,方便切换各种底层Cache(如:redis)使用Spring Cache的好处:1,提供基本的Cache抽象,方便切换各种底层Cache;2,通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;3,提供事务回滚时也自动回滚缓存;4,支持比较复杂的缓存逻辑;

m0_46568965的博客 2371

springboot-redis缓存数据信息

(新手笔记) **本篇依据狂神瑞吉外卖项目缓存短信,菜品数据部分进行记录狂神说Java yaml配置redis ##rediscofig配置(主要是为了redis图形化界面便于查看数据) 缓存短信验证码 在未优化的项目中,验证码存储在session中,有效期(30min),我们需要将其缓存在redis中: 缓存菜品数据 缓存菜品数据 在移动端,用户查询某个菜品分类时都要查询数据库,造成频繁访问,极大的降低了性能,所以需要将菜品数据存放在缓存中,避免频繁访问数据库。......

sashaSloan的博客 407

Spring实战——缓存数据

缓存(caching)可以存储经常会用到的信息,如果不使用缓存,每次查询数据时都会请求数据库,为了减小数据库的压力,可以将数据添加到缓存中,这样每次需要的时候,这些信息都是立即可用的。Spring自身并没有实现缓存的解决方案,但是它对缓存功能提供了声明式的支持,能够与多种流行的缓存实现集成。 本示例中需要的Jar包依赖(注意redis相关依赖的版本): <project xmlns="...

下半夜的风 669
上一篇: 我后悔在简历上写了“精通”…
下一篇: 程序员简历上最实用的4个“吸睛”技巧
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值