Spring cache整合Redis使用介绍

news2024/10/6 18:26:34

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、 Spring cache简介
  • 二、 常用注解
  • 三、 使用步骤
    • 3.1 引入依赖
    • 3.2 开启缓存支持
    • 3.3 引入Redis配置
    • 3.4 添加注解
    • 3.5 启动测试,发现报如下错误
    • 3.6 Redis客户端存储的是二进制数据如何解决
  • 四、 注解中key和value的介绍及使用(重点)
    • 4.1 每个注解的SPEL表达式支持有所区别
    • 4.2 使用时还需注意
  • 五、 设置Spring cache的缓存失效时间
    • 5.1 第一种
    • 5.2 第二种

是

一、 Spring cache简介

官方文档中有详细介绍:https://docs.spring.io/spring-framework/reference/integration/cache/annotations.html
Spring cache是Spring提供的通用缓存框架,利用AOP,实现了基于注解的缓存功能。
Spring cache只是提供了一层抽象,地城可以切换不同的cache实现,具体就是通过CacheManager接口开统一不同的缓存技术,CacheManagerSpring提供的各种缓存技术抽象接口。

二、 常用注解

注解描述
@EnableCaching开启缓存注解功能
@Cacheable 从缓存查询,存在则返回,不存在查询数据库,存入缓存
@CachePut将数据结果存入缓存
@CacheEvict清空缓存内容属性(allEntries = true) 表示清空所有
@Caching多缓存配置

缓存非null值
因为在使用中,可能会查询到null所以进行处理
在@Cacheable注解中,提供了两个属性,分别是 :condition ,unless

  • condition:表示满足条件,再缓存
  • unless: 表示满足条件,不缓存
  @Cacheable(value = "cache",key = "#id",unless = "#result == null")
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return providerService.queryById(id);
    }

注意: 这里只能使用unless,因为在condition中无法获取到结果#result

三、 使用步骤

  • 在Spring Boot项目中,使用缓存技术只需在项目导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持。
  • 由于Spring cache的基本功能是spring核心(spring-context)中提供,无需引入其他依赖。
  • 默认情况下,Spring cache使用ConcurrentHashMap作为本地缓存存储数据,如何要使用其他的缓存框架,我们只需要做简单的配置即可。
  • 例如:使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可

3.1 引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

3.2 开启缓存支持

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

3.3 引入Redis配置

默认情况下,Spring cache使用ConcurrentHashMap作为本地缓存存储数据,如何要使用其他的缓存框架,我们只需要做简单的配置即可。

 <!-- redis -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
spring:
  redis:
    host: 196.120.168.100
    port: 6379
    database: 1
    password:

3.4 添加注解

下面方法只是根据id查询数据库,因此简单的代码就不展示了,我们主要关注注解的使用就可以了。

    /**
     * 根据id查询用户信息
     */
    @Cacheable("user")
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return providerService.queryById(id);
    }

3.5 启动测试,发现报如下错误

在这里插入图片描述
只需加入该配置即可:

spring:
  cache:
    type: redis

接口返回正常,redis客户端查看正常
在这里插入图片描述在这里插入图片描述

3.6 Redis客户端存储的是二进制数据如何解决

但是发现redis存储的格式是二进制形式(默认序列化使用的是 JdkSerializationRedisSerializer ,存储二进制字节码)。不够直观,这时我们可以自定义RedisTemplate模板

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer); // key
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        // 指定要序列化的域(field,get,set),访问修饰符(public,private,protected)
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); //value

        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}
  • 再次调用查看,还是二进制,这时发现RedisTemplate调用是正常的,而只有使用@Cacheable("user")时是二进制
  • 这是因为使用@Cacheable注解的时候会将返回的对象缓存起来,默认缓存的值是二进制的,这时添加如下配置,定义redisCacheManagerredisTemplate配置进行绑定
  @Bean
    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
//                .entryTtl(Duration.ofHours(1))// 设置缓存有效期一小时
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }

成功查看
在这里插入图片描述

四、 注解中key和value的介绍及使用(重点)

  • value:缓存的名称,每个缓存名称下面可以有多个key
  • key : 缓存的key, 支持SPEL表达式
    /**
     * 根据id查询用户信息
     */
    @CachePut(value = "user",key = "#result.id")
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return providerService.queryById(id);
    }

4.1 每个注解的SPEL表达式支持有所区别

官方文档中有详细介绍:https://docs.spring.io/spring-framework/reference/integration/cache/annotations.html
在这里插入图片描述这里列出一些,供参考
在这里插入图片描述在这里插入图片描述

常用格式
    @CachePut(value = "cache",key = "#user.id")
    @CachePut(value = "cache",key = "#p0.id")
    @CachePut(value = "cache",key = "#root.args[0].id")
    @CachePut(value = "cache",key = "#id")
    @CachePut(value = "cache",key = "'test'+ #id")

静态方法调用
	@Cacheable(value = "user",key = "T(com.use.dto.bean.CurrentRequest).getUser().getUid()")

4.2 使用时还需注意

例如:

  • @CachePut可以使用#result
  • @Cacheable中则不可以使用,具体这里不一一测试,使用时还需注意

在这里插入图片描述
在这里插入图片描述

五、 设置Spring cache的缓存失效时间

在真实开发中失效时间是必须设置的,不然一直占用内存是不可取的

5.1 第一种

全局生效

spring:
    redis:
      time-to-live: 1800000  # 缓存过期时间 单位毫秒

5.2 第二种

局部设置

@Configuration
public class RedisCacheConfig {

    //设置失效时间
    private static final Map<String, Duration> cacheMap;

    static {
        cacheMap = ImmutableMap.<String, Duration>builder().put("user", Duration.ofMinutes(5)).build();
    }

    //配置RedisCacheManagerBuilderCustomizer对象
    @Bean
    public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
        return (builder) -> {
            //根据不同的cachename设置不同的失效时间
            for (Map.Entry<String, Duration> entry : cacheMap.entrySet()) {
                builder.withCacheConfiguration(entry.getKey(),
                        RedisCacheConfiguration.defaultCacheConfig().entryTtl(entry.getValue()));
            }
        };
    }
}

在这里插入图片描述在这里插入图片描述

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

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

相关文章

【附安装包】Revit2024安装教程

软件下载 软件&#xff1a;Revit版本&#xff1a;2024语言&#xff1a;简体中文大小&#xff1a;10.05G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU3.0GHz 内存8G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.c…

JSON的处理

1、JSON JSON(JavaScript Object Notation)&#xff1a;是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写&#…

PySpark安装及WordCount实现(基于Ubuntu)

先盘点一下要安装哪些东西&#xff1a; VMwareubuntu 14.04&#xff08;64位&#xff09;Java环境&#xff08;JDK 1.8&#xff09;Hadoop 2.7.1Spark 2.4.0&#xff08;Local模式&#xff09;Pycharm &#xff08;一&#xff09;Ubuntu VMware 和 ubuntu 14.04&#xff08;…

【bug记录】ios动画闪烁,@keyframe动画在100%的时候设置为opacity:0,最后一帧会变成opacity:1

背景 前段时间需要实现一个水波纹扩散效果&#xff0c;大概效果就两点&#xff1a;波纹逐渐扩散&#xff0c;半径逐渐增大&#xff1b;透明度逐渐降低&#xff08;如下图&#xff09;。本以为这就是一个简单的动画&#xff0c;很轻松就实现了。但是发布之后测试同学反馈&#…

Allegro如何设置Net Class在物理和间距规则中同步操作指导

Allegro如何设置Net Class在物理和间距规则中同步操作指导 在用Allegro设置规则的时候,设置net class是必要的操作,时常需要在物理和间距规则都设置好Class,如果物理和间距规则中都单独去设置的话比较费时间。如下图Net Class 下面介绍如何将物理和间距规则中的Class同步起来…

AgentBench:AI智能体的应用前景——消费端的应用

从应用前景上看,AI智能体既可以被用于消费端来提升用户的使用体验,也可以被用于生产端来作为重要的生产力工具。 1、消费端的应用 在消费端,AI智能体将凭借其强大的能力取代现有的聊天机器人,并应用到广泛的领域。聊天机器人目前已比较普及,比如苹果的Siri、亚马逊的A…

Java学习笔记39

Java笔记39 反射机制 静态/动态语言 动态语言 是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。主要动态语言&#…

学习记录——FLatten Transformer

FLatten Transformer: Vision Transformer using Focused Linear Attention ICCV 2023 聚焦式线性注意力模块 关于Transformer 在Transformer模型应用于视觉领域的过程中&#xff0c;降低自注意力的计算复杂度是一个重要的研究方向。线性注意力通过两个独立的映射函数来近似S…

【图解】多层感知器(MLP)

图片是一个多层感知器&#xff08;MLP&#xff09;的示意图&#xff0c;它是一种常见的神经网络模型&#xff0c;用于从输入到输出进行非线性映射。图片中的网络结构如下&#xff1a;

python 打印沁园春 雪 居中对齐 文本对齐

以下是python 中使用 DebugInfo 模块居中对齐打印《沁园春・雪》的效果 引入模块 pip install DebugInfopython代码 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugInfo import * # endregion诗文 沁园春 雪 作者: 毛主席 北国风光&#xff0c;千里冰封…

12312321312

目录 层次分析法(AHP) 基本步骤 建立层次模型 构造判断矩阵 一致性检验 求得权重 填表得结果 一点补充 详细做法补充 特征向量含义思考 一些问题 优劣解距离法(TOPSIS) 基本思想 模型步骤 数据处理 指标正向化 标准化处理 计算得分 *结果处理 熵权法 模型思…

【【萌新的STM32学习-12】】

萌新的STM32学习-12 GPIO八种模式 1输入浮空 输入用&#xff0c;完全浮空&#xff0c;状态不定 2输入上拉 输入用&#xff0c;用内部上拉&#xff0c;默认是高电平 3输入下拉 输入用&#xff0c;用内部下拉&#xff0c;默认是低电平 4模拟功能 ADC DAC 5开漏输出 软件IIC的…

春秋云镜 CVE-2019-2725

春秋云镜 CVE-2019-2725 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞 靶标介绍 Oracle Fusion Middleware&#xff08;子组件&#xff1a;Web Services&#xff09;的 Oracle WebLogic Server 组件中的漏洞。受影响的受支持版本为 10.3.6.0.0 和 12.1.3.0.0。…

5个最重要的开源电商 ERP 系统功能

作为开源电商 ERP 系统领域的专家&#xff0c;我想分享一下电商企业在选择 ERP 系统时需要考虑的关键功能。 功能一&#xff1a;库存管理 库存管理是任何一家电商企业都必须考虑的问题。好的库存管理系统可以帮助企业减少库存积压、避免库存短缺&#xff0c;并提高库存周转率…

如何使用HTML5新增的标签来优化SEO?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用HTML5新增的标签来优化SEO&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对…

SpringCloud学习笔记(一)_快速入门

SpringCloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff09;。分布式系统的协调导致了样板模式, 使用Spr…

MyBaits_Plus

MyBatis_Plus 文章目录 MyBatis_Plus0. 必备知识1.快速入门1.1什么是MyBatis_Plus1.2快速使用 2.配置日志3.CURD的扩展3.1Insert3.2 update3.3自动填充3.4乐观锁3.5delete 4.select4.1基本查询4.2分页查询4.3条件构造器 5.代码自动生成器 0. 必备知识 使用第三方组件一般步骤 …

[已解决]system: No such file or directory #include <filesystem>

make编译&#xff0c;遇到&#xff1a;system: No such file or directory #include <filesystem> &#xff08;1&#xff09;升级gcc[参考][gcc升级参考1][gcc升级参考2]&#xff1a;gcc7.5 升级为 gcc11.1, 未解决问题&#xff1b; &#xff08;2&#xff09;修改头文…

TienChin 渠道管理-工程创建

因为本文章主要围绕着项目开发进行&#xff0c;所以前言不做开头&#xff0c;直接上内容。 添加字段 我们的渠道表&#xff0c;我看到若依脚手架当中有一个是否删除的标志字段&#xff0c;所以我这里也添加一下&#xff1a; ALTER TABLE tienchin_channelADD COLUMN del_flag c…

使用MySQL:5.6和owncloud镜像搭建个人网盘

拉取镜像 [rootkvm ~]# docker pull mysql:5.6[rootkvm ~]# docker pull owncloud启动mysql容器 [rootkvm ~]# docker run -d --name db1 -e MYSQL_ROOT_PASSWORDroot mysql:5.6 db832e4e4333a0e9a7c152a67272721fdbe5381054090c5eb24f90455390a852 [rootkvm ~]# docker ps …