SpringBoot整合redis并使用缓存注解

news2024/10/6 2:21:15

SpringBoot整合redis并使用缓存注解

直接上代码

  1. 添加Redis依赖,在pom.xml文件中添加以下依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. application.yml 配置Redis连接信息
spring:
  cache:
    type: redis
  redis:
    host: 127.0.0.1 # Redis服务器地址
    database: 1 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password: # Redis服务器连接密码(默认为空)

指定缓存类型redis

3.配置缓存管理器

@Configuration
@EnableCaching
public class RedisTemplateConfiguration {
    /**
     * 默认过期时长,单位:秒
     */
    @Getter
    private long expire = 60 * 60 * 24;

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(RedisSerializer.java());
        redisTemplate.setHashValueSerializer(RedisSerializer.java());
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    }

    @Bean
    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForHash();
    }

    @Bean
    public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
        return redisTemplate.opsForValue();
    }

    @Bean
    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForList();
    }

    @Bean
    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForSet();
    }

    @Bean
    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForZSet();
    }
}

总之,通过@EnableCaching注解,我们可以方便地启用缓存功能,并结合Redis作为缓存实现。同时,通过@Cacheable注解,我们可以指定缓存名称和键值,实现缓存功能。

如果你需要补充EnableCaching相关知识点,请查看:@EnableCaching,@Cacheable, @CachePut,@CacheEvict详解。

在使用@EnableCaching注解后,我们可以在需要缓存的方法上添加@Cacheable注解,以启用缓存功能。例如:

    @ApiOperation("dictType => 全局 根据字典类型查询字典详情数据信息")
    @GetMapping(value = "/dictType/{dictType}")
    @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#dictType")
    public R<List<SysDictDetail>> dictType(@PathVariable String dictType) {
        return R.success(sysDictDetailService.selectDictDataByType(dictType));
    }

redis保存格式如下:
在这里插入图片描述

为了方便大家更清晰的理解,我本地跑起一个程序验证一下,可以看一下打印的日志信息,第一次请求的时候是从数据库中加载出来的数据,再次请求的时候直接从缓存里面读取了。

在这里插入图片描述

常见问题:

1、缓存的值没有实现Serializable接口

Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [cn.harry.common.api.R]

这个错误通常是因为在使用Spring Cache时,缓存的值没有实现Serializable接口,导致无法序列化。解决这个问题的方法是让缓存的值实现Serializable接口,以便在序列化时能够正确地将对象转换为字节流。下面是一个示例:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Cacheable(value = "user_details", key = "#id")
    public Serializable getUserById(Long id) {
        User user = userDao.getUserById(id);
        return (Serializable) user;
    }
}

在上面的示例中,我们在getUserById()方法上添加了@Cacheable注解,并指定了缓存名称为"user_details",缓存键为方法参数id。同时,我们将返回值类型改为Serializable,并将User对象强制转换为Serializable类型,以便在序列化时能够正确地将对象转换为字节流。

总之,让缓存的值实现Serializable接口是解决这个问题的关键。如果缓存的值无法实现Serializable接口,可以考虑使用其他的缓存实现方式,例如使用JSON格式存储缓存值。

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

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

相关文章

《找 bug 的活动》VIP 会员免费的视频,PC Web 端无法观看

《找 bug 的活动》VIP 会员免费的视频&#xff0c;PC Web 端无法观看 文章目录 《找 bug 的活动》VIP 会员免费的视频&#xff0c;PC Web 端无法观看问题描述期望 问题描述 CSDN 学习中心的视频课&#xff0c;有部分是 VIP 会员免费的课程&#xff0c;但是会重复跳转到 确认订…

支持CT、彩色超声、内窥镜检查的医院影像PACS系统源码(三维重建技术)

首先&#xff0c;PACS影像存取与传输系统是以实现医学影像数字化存储、诊断为核心任务&#xff0c;从医学影像设备&#xff08;如CT、CR、DR、MR、DSA、RF等&#xff09;获取影像&#xff0c;集中存储、综合管理医学影像及病人相关信息&#xff0c;建立数字化工作流程。 其次&…

思必驰:以对话式语言计算大模型为核心的大模型体系,才是未来!

2023年6月26日&#xff0c;思必驰联合创始人、首席科学家俞凯在第五届全球智博会发表主题演讲《对话式通用人工智能与专业化语言大模型》&#xff0c;他表示大模型是人工智能的新时代&#xff0c;语言大模型、对话式的语言大模型是整个人工智能大模型进一步突破的核心。而专业化…

Unity UGUI Canvas Overlay模式获取屏幕坐标

UGUI Canvas Overlay模式获取屏幕坐标 &#x1f354;效果&#x1f371;获取 &#x1f354;效果 &#x1f371;获取 ui的position就是屏幕坐标(●’◡’●) var screenPos new Vector2(transform.position.x, transform.position.y);

什么是直放站

直放站是无线通信系统中信号向地下空间延伸覆盖设备的总称&#xff0c;直放站分近端机和远端机两部分&#xff0c;近端机通过基站或空间耦合信号并进行选频、滤波处理后变换为光信号&#xff0c;通过光纤传输到地下空间&#xff08;隧道&#xff09;内&#xff0c;由光直放站远…

LeetCode_Day7 | 三数之和、四数之和

LeetCode_哈希表 15.三数之和1.题目描述2.双指针法2.1思路及注意点2.2代码实现 3.哈希法(有待修正)3.1 思路3.2 代码实现 18.四数之和1. 题目描述 15.三数之和 1.题目描述 详情leetcode链接 2.双指针法 2.1思路及注意点 将数组排序&#xff0c;有一层for循环&#xff0c;i从…

uniapp 中 引入vant组件 和 vant 报错Unclosed bracket 的问题解决

在uniapp 中引入vant组件&#xff0c;遇到一个报错&#xff0c;所以在此记录一下完整过程 一、引入vant组件 方式一&#xff1a;前往 GitHub官网 Vant 下载压缩文件&#xff0c;获取下载中的dist 文件 方式二&#xff1a;通过npm install 方式引入 npm i vant/weapp -S --pr…

【Android开发日常】一文弄懂桌面图标快捷菜单 桌面小组件

本文将介绍如何创建和管理应用快捷方式、如何创建和管理应用桌面小组件。 目录 一、桌面菜单1.1 概览1.2、为什么需要桌面图标快捷菜单1.3、如何实现桌面图标快捷菜单1.3.1 创建静态快捷方式1.3.2 创建动态快捷方式1.3.3 创建固定快捷方式1.3.4 使用快捷方式的最佳做法 1.4 注…

DOTA-c(RGDyK)和DOTA-cyclo(RGDyK)对αVβ3的亲和力和选择性的影响

&#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09; ●英文名&#xff1a;DOTA-cyclo(RGDyK)&#xff0c;DOTA-c(RGDyK) ●外观以及性质&#xff1a; DOTA-cyclo(RGDyK)中Cyclo(RGDyK)作用于αVβ3比作用于αVβ5和αIIbβ3表现更高的亲和力…

Prometheus 指标存储 观测 dubbo /windows_exporter指标 windows 版本 其他系统换个语法思路一样

目录 下载 Prometheus 访问Prometheus Targets 发现服务 对应的 dubbo 指标就出来了 Dubbo脚手架生成个最简单的项目 导入 Prometheus 相关包 或者使用这个包即可 启动后就自动上报指标了 Windows_exporter or node_exporter 端口 9182 Prometheus 配置 windows_exp…

第37节:cesium 下雪效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

SpringBoot - 在IDEA中经常发现:Could not autowire. No beans of ‘xxx‘ type found的错误

错误描述 在SPRINGBOOT的项目中&#xff0c;使用IDEA时经常会遇到Could not autowire. No beans of ‘xxxx’ type found的错误提示&#xff0c;但是程序的编译和运行都没有问题&#xff0c;这个错误提示并不影响项目的生产。 解决方案

Unity3D:专属 Inspector

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 专属 Inspector 专属 Inspector 是专门用于特定游戏对象、Unity 组件或资源的 Inspector 窗口。 它始终显示为其打开的项目的属性&#xff0c;即使您在场景或项目中选择了其他内容…

Flask框架之WTForms(详解)

目录 WTForms介绍和基本使用 WTForms介绍 基本使用 WTForms表单验证的基本使用 WTForms常用验证器 WTForms自定义验证器 场景&#xff1a;验证码实现 WTForms渲染模版 常用的方法 代码示例 WTForms介绍和基本使用 WTForms介绍 这个插件库主要有两个作用。 第一个是做…

十九、socket套接字编程(一)——UDP

文章目录 一、socket套接字编程接口&#xff08;一&#xff09;socket头文件&#xff08;二&#xff09;socket 常见API&#xff08;套接字编程接口&#xff09;1. 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器 )2.绑定网络信息 (TCP/UDP, 服务器 )3.开始监听 socket (TCP…

如何使用 OCI Artifacts、ORAS 和 Docker Hub 标准化软件交付

Docker Hub 是最著名的用于分发和共享容器映像的注册表。不过, Docker Hub 和其他符合 OCI 的注册表现在可以做的不仅仅是容器镜像。ORAS (OCI 注册表作为存储)项目将注册表转换为通用工件存储,能够发布与您的应用程序相关的任何资产。 在本文中,您将了解 ORAS 是什么、它…

echarts-热力图+高亮+轨迹

var mapData [{name: "北京",devicesCount: 100, //总数value: 10, //使用个数},{name: "天津",devicesCount: 50,value: 20,},{name: "上海",devicesCount: 80,value: 30,},{name: "重庆",devicesCount: 90,value: 40,},{name: "…

HOT28-两数相加

leetcode原题链接&#xff1a;两数相加 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设…

搭建mysql集群(Windows环境)

1、MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性&#xff0c;增强了安全性&#xff0c;使得单个MySQL服务器故障不会对系统产生巨大的负面效应&#xff0c;系统的稳定性得到保障。 MySQL群集需要有一组计算机&#xff0c;每台计算机的…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…