Spring Boot Cache 缓存使用

Spring Boot 中使用cache缓存的方法 Spring Cache是Spring针对Spring应用,给出的一整套应用缓存解决方案。下面小编给大家带来了Spring Boot 中使用cache缓存的方法,感兴趣的朋友参考下吧一、什么是缓存 CacheCache 一词最早来自于CPU设计当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在... 阅读详情

1.Spring Boot 使用 Cache

我们知道一个程序的瓶颈在于数据库,我们也知道内存的速度是远大于硬盘的速度的。当我们需要重复地获取相同的数据的时候,我们一次又一次的请求数据库或远程服务,导致大量的时间耗费在数据库查询或者远程方法调用上,导致程序性能的恶化,这便是数据缓存要解决的问题。

1.1 Spring 缓存支持

Spring 定义了 org.springframework.cache.CacheManager 和 org.springframework.cache.Cache 接口用来统一不同的缓存的技术。其中,CacheManager 是 Spring 提供的各种缓存技术抽象接口, Cache 接口包含缓存的各种操作(增加,删除,获得缓存,我们一般不会直接和此接口打交道)。

1.2 Spring 支持的 CacheManager

针对不同的缓存技术,需要实现不同的 CacheManage ,Spring 定义了如下所示的 CacheManager 实现。

CacheManager描述
SimpleCacheManager使用简单的 Collection 来存储缓存,主要用来测试用途
ConcurrentMapCacheManager使用 ConcurrentMap 来存储缓存
NoOpCacheManager仅测试用途,不会实际存储缓存
EhCacheManager使用 EhCache 作为缓存技术
GuavaCacheManager使用 Google Guava 的 GuavaCache 作为缓存技术
HazelcastCacheManager使用 Hazelcast 作为缓存技术
JCacheCacheManager支持 JCache(JSR-107)标准的实现作为缓存技术,如 Apache Commons JCS
RedisCacheManager使用 Redis 作为缓存技术

1.3 声明式缓存

Spring 提供了4个注解来声明缓存规则。这四个注解如下:

注解解释
@Cacheable在方法执行前 Spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有,调用方法并将方法返回值放进缓存
@CachePut一定会调用方法,并将方法返回值放到缓存中,@CachePut 的属性和 @Cacheable 保持一致
@CacheEvict将一条或者多条数据从换从中删除
@Caching可以通过 @Caching 注解组合多个注解策略放在一个方法上

@Cacheable,@CachePut,@CacheEvict 都有 value 属性,指定的是要使用的缓存名称;key 属性指定的是数据在缓存中的存储的键。

1.4 开启声明式缓存支持

开启声明式缓存支持十分简单,只需在配置类上使用 @EnableCaching 注解即可,如:

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

1.5 Spring Boot 的支持

在 Spring 中使用缓存技术的关键是配置 CacheManager,而 Spring Boot 为我们自动配置了多个 CacheManager 的实现。

在不做任何额外的配置的情况下,默认使用的是 SimpleCacheConfiguration,即使用 ConcurrentMapCacheManager。 Spring Boot 支持以 “spring.cache” 为前缀的属性来配置缓存。

配置 cache 属性,用 application.xml 和 application.yml 都可以。这里我使用的是更简洁的 application.yml。

spring:
    cache:
      type: #可选 generic,ehcache,hazelcast,infinispan,jcache,redis,guava,simple,none
      cache-names: # 程序启动时创建缓存名称
      ehcache:
        config: # ehcache 配置文件地址
      infinispan:
        config: # infinispan 配置文件地址
      jcache:
        config: # jcache 配置文件地址
        provider: # 当多个 jcache 实现在类路径中的时候,指定 jcache 实现
      caffeine:
        spec: # guava specs

1.6 添加依赖

  • 如果新创建项目则在 Core 中选择 Cache 依赖即可。
  • 如果在已开发中的项目中使用在 pom.xml 中添加如下依赖:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

1.7 实战

    // 如果没有设置 key 值,则方法参数默认为缓存的 key 值
    @Cacheable(value = "user")
    @Override
    public Object getById(Long id) {

        UserDO userDO1 = userDOMapper.selectByPrimaryKey(id);
        System.out.println(userDO1);

        return userDO1;
    }

    // 如果方法参数是对象,可以使用 '#' 来选择对象的那个属性值来充当 key
    @CachePut(value = "user", key = "#userDO.id")
    @Override
    public Object save(UserDO userDO) {
        userDOMapper.insertSelective(userDO);
        return userDO;
    }

    // 删除缓存中数据 key 还是方法参数值
    @CacheEvict(value = "user")
    @Override
    public Object delete(Long id) {

        return userDOMapper.deleteByPrimaryKey(id);
    }

1.8 扩展

Spring 缓存默认使用的是 ConcurrentMap 来缓存数据的,重启项目的时候可能缓存就消失了。有时我们希望缓存也可以持久化,在项目重启的时候照样可以使用原来的缓存数据。这里我们使用 redis 来持久化缓存数据。

1.8.1 整合 redis

Spring Boot 整合 redis :https://blog.youkuaiyun.com/lnview/article/details/80777144

1.8.2 配置文件
spring:
    cache:
      type: redis #设置 redis 缓存
      redis:
        time-to-live: 3600s #设置有效期 3600秒
        cache-null-values: false #value 值是否可以为 null(如果是 false,value 为 null 的时候报错)


    redis:
      host: 127.0.0.1
      database: 0
      password: 123456789
      port: 6379
      jedis:
        pool:
          max-idle: 8
          min-idle: 0
          max-active: 8
1.8.3 实战

还是用上面的实战例子,来让我们看看 redis 中存储的内容。
这里写图片描述
缓存的 key 会获取在方法注解上设置的 value,并自动添加 :: 符号。value 的缓存格式是默认的二进制缓存(优点是反序列化时不需要提供类型信息(class),但缺点是序列化后的结果非常庞大,是JSON格式的5倍左右)。

这时我们可以自定义序列化 redis 序列化方式。这里我们使用 alibaba 的 fastjson 序列化方式
添加依赖:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.32</version>
        </dependency>

自定义序列化类:

public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Class<T> clazz;

    public FastJsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);
        return JSON.parseObject(str, clazz);
    }

}

配置 Redis 序列化方式:

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    /**
     *  设置 redis 数据默认过期时间
     *  设置@cacheable 序列化方式
     * @return
     */
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(){
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        ParserConfig.getGlobalInstance().addAccept("com.zsh.");
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
        configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(30));
        return configuration;
    }


    /**
     * 设置 redisTemplate 的序列化设置
     *
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 1.创建 redisTemplate 模版
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        // 2.关联 redisConnectionFactory
        template.setConnectionFactory(redisConnectionFactory);
        // 3.创建 序列化类
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
        // 全局开启AutoType,不建议使用
        // ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        // 建议使用这种方式,小范围指定白名单
        ParserConfig.getGlobalInstance().addAccept("com.zsh.");
        ObjectMapper om = new ObjectMapper();
        // 4.设置可见度
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 5.启动默认的类型
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        // 6.设置 value 的转化格式和 key 的转化格式
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

}

再来看看我们 redis 中存储的数据:
这里写图片描述
又可以直观的看出我们存储的数据了。


若博客中有错误或者说的不好,请勿介意,仅代表个人想法。
csdn博客:https://blog.youkuaiyun.com/LNView
本文地址:https://blog.youkuaiyun.com/LNView/article/details/80785099

有问题或者喜欢的欢迎评论。

转载请注明出处!!!!!!

参考资料:
《Spring Boot 实战》
https://www.jianshu.com/p/23f2c4c92093?utm_source=oschina-app

芋道源码 —— Spring Boot 缓存 Cache 入门 随着系统访问量的增加,数据库往往成为性能瓶颈。为了减少数据库的压力,提高系统的响应速度,我们可以通过缓存来优化系统性能。 阅读详情

相关推荐

SpringBoot : Spring Boot中使用数据缓存 spring-boot-starter-cache

1.美图 2.概述 项目中经常会用到cache技术,Spring boot提供了方便的注解以便我们从重复的cache代码中解放出来。 首先得引入spring-boot-starter-cache这个jar,并在主类中使用 @EnableCaching 注解表示开启缓存。 常用到一下三个注解: @Cacheable 先看缓存是否有数据,有则直接返回,不调用目标方法;否则调用目标方法,并将结果缓...

九师兄 4399

Spring Cache 带你飞(二)

接着上一篇讲了 Spring Cache 如何被 Spring Aop 代理加载对应的代码,以及何如注入相关界面逻辑。

qq_57222058的博客 512

【Spring】Spring Boot 中使⽤ Cache 缓存的使⽤

主要参数解释举例例value缓存的名称,在 spring 配置⽂文件中定义,必须指定⾄至少⼀一个如 @Cacheable(value=“mycache”) 或者 @Cacheable(value= {“cache1”, “cache2”}key缓存的 key,可以为空,如果指定要按照 SpEL表达式编写,如果不不指定,则缺省按照⽅方法的所有参数进⾏行行组合如@Cacheable(value=“testcache”,key=“#userName”)condition。

九师兄 873

SpringCache简单应用

一,整合 1,引入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.sp

Alt__的博客 194

Spring Boot 3.x 系列【25】Spring Cache缓存技术使用详解

在实际开发中,最常见的就是**数据库缓存**,将热点的数据保存在缓存中,减少数据库的查询,不仅能减轻数据库压力,更能提升响应速度。 如何去实现**缓存**,目前也有很多种策略,最常用的就是`Cache-Aside `(边缘缓存模式),适用于读多写少的业务场景,当然关于数据一致性的问题这里不讨论。

记录知识、锤炼自我 1525

Python+ArcGIS实战:5步搞定土壤类型预测(附随机森林模型配置技巧)

本文详细介绍了如何结合Python与ArcGIS,利用随机森林模型进行土壤类型预测。通过5个核心步骤——数据预处理、样本创建、模型构建、空间预测与精度验证,构建了一套自动化、高精度的空间预测工作流,并提供了关键的模型配置与调参技巧,助力GIS开发者高效完成土壤制图任务。

weixin_29227585的博客 395

【SpringBoot】集成缓存抽象层SpringCache进行项目实战

`Spring从3.1`开始定义了`org.springframework.cache.Cache `和`org.springframework.cache.CacheManager`接口来**统一不同的缓存技术**; 并支持使用`JCache(JSR-107)注解`简化我们开发。它本质上是一个`缓存抽象层`,底层是用`Map`实现的。`缓存数据量不是很大的时候推荐使用`,不然还是要用第三方的缓存redis、echcache等。

墩墩分墩 966

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。首先在对项目编译产生文件的属性设置为Release。 在编译完成后,找到每个CORE单独生成的DXE文件: 文件通常位于项目目录下每个core的Release文件中。安装SC589评估板的驱动(ADSP-SC5xx_EZ-KIT_Lite-Rel2.0.0.exe)后,在安装目录下可以找到SPI FLASH芯片的驱动程序(sc589_w25q128fv_dpia_Core1.dxe): 把文件copy到CCES 的目录下由于SC58x处理器的特殊性

daijingxin的博客 3730

SpringBoot使用缓存

Spring 框架已经具备了缓存机制,虽然我们可以使用 Redis 等作为缓存处理机制,不过对于非常零碎的数据交互其实使用 Spring 的缓存机制反而显得简单;而且我们可以将 Spring 的缓存机制融合 Redis 和 关系型数据库建立一个完备的数据处理方案,相当于实现了 3 级缓存,将非常有助于超大型系统的数据交互压力。

少年闰土 1591

《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

当数据具有资产属性之后,数据便可以直接或者间接地为公司、为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易。 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战,主要包括: 数据的质量、价格如何定义 在合法合规的前提下,数据的交易如何确保不会泄露用户的隐私 如何构建合理的激励机制来鼓励更多的参与方加入数据交易市场中 大数据交易 数据交易的定义 数据交易是指一种对数据进行买卖的行为,大数据交易由三方共同参与,分别为数据提供方、大数据交易平台和数据需求方:

IEEE802_11的博客 3433

歪枣网股票数据下载接口汇总一

歪枣网上下载接口动态信息如下: 接口名称:A股列表,接口描述:沪深京A股基本信息,接口地址:/doc/getStockHSABaseInfo?code=all&fields=code,name,stype,hsgt,bk,roe,zgb,ltgb&export=0&token= 请求参数描述: 参数名:code,参数描述:股票代码,支持批量查询,用逗号分隔,每次最多30个;若为all,则表示全部,即可获取任意一天内的所有数据。 请求参数描述: 参数名:fields,参数描述:数据字段

waizaowang的博客 2731

SpringBoot的缓存管理

SpringBoot的默认缓存,基于注解的Redis缓存实现以及基于API的Redis缓存实现,还有解决乱码的配置类

有趣的灵魂万里挑一,好看的皮囊你又没有 3109

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 179

Spring Boot+Spring Cache使用Redis缓存

Spring Cache Spring Cache用于对主流的缓存组件(Redis,EhCache,GuavaCache,JCache等)进行集成,提供统一的,基于注解的缓存功能(利用Spring AOP特性)。 常用注解: @Cacheable 一般使用在查询方法。方法的返回值会被缓存。下一次查询,会先检查缓存中是否存在: 如果有,则直接返回,不再调用方法体; 如果没有,则调用方法,然后把结果放入缓存。 value与cacheNames本质相同,定义缓存名称 key:设置key。 keyGener

u012708900的博客 406

QGIS编译(跨平台编译)001:Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

QGIS编译;Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

LuckyHanMo的博客 3078

【教程4>第1章>第12节】通过Verilog读取txt格式数据进行测试并将结果导入到matlab

我们在verilog的testbench中,调用txt文件,将上述正弦样本数据作为测试激励输入到verilog模块中。通过这个方法,可以将一些较为复杂的数据导入到verilog中,进行FPGA数据处理模块的开发。即通过w方式打开一个新的txt文件,然后将verilog的输出保存到XY1.txt文件中。这个部分是txt文件的路径,实际使用时,修改为您自己的路径,或者将txt文件放在和我一样的路径中。这个是数据长度,matlab产生的txt多少长度,这个参数就修改为多少长度。这个txt就是保存这段数据的文件。

FPGA/MATLAB学习教程/源码/项目合作开发 1374

spring boot 缓存_Guava Cache本地缓存在 Spring Boot应用中的实践

概述在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小。而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是支持缓存特性的。当然 Spring Boot默认使用的是 SimpleCacheConfiguration,即使用 ConcurrentMapCacheManager 来实现的缓存。但本文将讲述如何将 ...

weixin_39682897的博客 287

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1181

第 4-4 课:Spring Boot 中使⽤ Cache 缓存的使⽤

我们知道绝⼤多数的⽹站/系统,最先遇到的⼀个性能瓶颈就是数据库,使⽤缓存做数据库的前置缓存,可以 ⾮常有效地降低数据库的压⼒,从⽽提升整个系统的响应效率和并发量。 以往使⽤缓存时,通常创建好缓存⼯具类,使⽤时将对应的⼯具类注⼊,操作⼯具类在前端处理缓存的逻 辑。其实这种⽅式是低效的,⼤部分使⽤缓存的场景是基于数据库的缓存,这类缓存场景的逻辑往往是:如 果缓存中存在数据,就从缓...

qq_34227896的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何利用Spring Boot和Spring Cache实现高效的缓存管理?

Spring Cache是Spring框架提供的一个缓存抽象,能够帮助我们简化缓存的使用。它允许开发者在应用中使用不同的缓存实现(比如EhCache、Redis、Caffeine等),并提供了简单易用的注解,让我们可以以声明式的方式管理缓存。借助Spring Cache,开发者无需关注底层缓存的实现细节,只需通过注解配置就能轻松实现缓存机制。

程序员总部的博客 1016

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java+cache使用方法_Spring Boot 中使用cache缓存的方法

一、什么是缓存 cachecache 一词最早来自于cpu设计当cpu要读取一个数据时,首先从cpu缓存中查找,找到就立即读取并送给cpu处理;没有找到,就从速率相对较慢的内存中读取并送给cpu处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。正是这样的读取机制使cpu读取缓存的命中率非常高(大多数cpu可达90%左右),也就是说cpu下一次要...

weixin_39800112的博客 1157

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot + Guava Cache缓存应用实战

Guava Cache缓存应用实战 问题背景 实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号)。 项目中有一个需求是要实时统计一些数据,一个应用下可能有多个相同的账号。由于服务商接口的限制,当批量查询时,可能出现同一个账号第一次查询有数据,但第二次查询无数据的情况。 解决方案 基于以上问题,提出用缓存的过期时间来解决。 这时,可用Redis和Guava Cache来...

一大三千的博客 5294

芋道 Spring Boot 缓存 Cache 入门

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2019 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络...

芋艿V 403

Spring boot Caffeine缓存(二)——Cache、LoadingCache

前边文章主要介绍了下Caffeine以及CacheManager,这里说下Caffeine的其它配置及用法。 LoadingCache LoadingCache直接定义一个缓存,在项目中可以直接拿来存取数据,同时还可以引入CacheLoad加载数据。 LoadingCache是个接口,继承了Cache...

坤哥的博客 1万+

Guava Cache本地缓存在 Spring Boot应用中的实践

概述 在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小。而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是支持缓存特性的。当然 Spring Boot默认使用的是 SimpleCacheConfiguration,即使用 ConcurrentMapCacheManager 来实现的缓存。但本文将讲...

IBLiplus的博客 665

Spring Boot整合Spring cache缓存

一、Spring Cache简介 Spring从3.1开始定义了一系列抽象接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们进行缓存开发。Spring Cache 只负责维护抽象层,具体的实现由你的技术选型来决定。将缓存处理和缓存技术解除耦合。 Spring Cache接口为缓存的组件规范定义,包含缓存的各种操作集合,并提供了各种xxxCache的实现,如RedisCache,EhCacheCache,ConcurrentMapCache等; 项目整合Spring Cach

程序员咏哥的博客 1192
上一篇: Spring Boot 整合 ActiveMQ
下一篇: Spring Boot 整合 Mybatis
Carey丶zsh
博客等级 码龄10年 15粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值