【Redis系列】Spring Boot 集成 Redis 实现缓存功能

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一、配置 Redis 连接
    • 二、使用 Jedis 操作 Redis
    • 三、使用 RedisTemplate 操作 Redis

摘要:本文介绍了如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。文章包括配置 Redis 连接、使用 Jedis 和 RedisTemplate 两种方式进行操作的示例代码,并探讨了它们的优缺点。


随着互联网应用的不断发展,对于数据的高效读写和缓存处理变得越来越重要。而 Redis 作为一款高性能的缓存数据库,被广泛应用于各种大型系统中。本文将介绍如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。

image-20240405200638404

一、配置 Redis 连接

在 Spring Boot 项目中,我们可以通过配置文件来指定 Redis 的连接参数。以 YAML 格式的配置文件为例,示例如下:

spring:redis:database: 3password: xxxxtimeout: 60000 #连接超时host: 10.xxx.14.40port: 6379jedis:pool:max-idle: 6 #最大空闲数max-active: 100 #最大连接数min-idle: 2 #最小空闲数

以上配置了 Redis 的数据库编号、密码、连接超时时间以及连接池的相关参数。

二、使用 Jedis 操作 Redis

Jedis 是 Java 操作 Redis 的一款常用客户端库。下面是使用 Jedis 进行操作的示例代码。

首先,我们需要创建一个 JedisConfig 类,用于配置 Jedis 连接池:

@Slf4j
@Configuration
public class JedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.timeout}")private Integer timeout;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.database}")private Integer database;@Value("${spring.redis.jedis.pool.max-active}")private int maxActive;@Value("${spring.redis.jedis.pool.max-idle}")private int maxIdle;@Value("${spring.redis.jedis.pool.min-idle}")private int minIdle;@Beanpublic JedisPool jedisPool() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxIdle(maxIdle);jedisPoolConfig.setMinIdle(minIdle);jedisPoolConfig.setMaxTotal(maxActive);JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, "default", password, database);log.info("JedisPool Connection Success:" + host + "\t" + port);return jedisPool;}
}

在上述代码中,我们通过@Configuration 注解将 JedisConfig 类标识为配置类,并通过@Bean 注解将 jedisPool 方法返回的 JedisPool 对象注册为 Spring 的 Bean。

接下来,我们可以创建一个 JedisUtils 类,用于获取 Jedis 资源和释放连接:

@Component
public class JedisUtils {@Autowiredprivate JedisPool jedisPool;/*** 获取Jedis资源*/public Jedis getJedis() {return jedisPool.getResource();}/*** 释放Jedis连接*/public void close(Jedis jedis) {if (jedis != null) {jedis.close();}}
}

在上述代码中,我们通过@Autowired 注解将 JedisPool 对象注入到 JedisUtils 类中。通过调用 getJedis 方法,我们可以获取一个 Jedis 资源对象,用于后续的操作。在完成操作后,调用 close 方法释放 Jedis 连接,以便连接可以被连接池重复利用。

接下来,我们可以创建一个 JedisClient 类,用于具体的操作 Redis:

@Slf4j
@Component
public class JedisClient {@Autowiredprivate JedisUtils jedisUtils;/*** 根据key查询value值*/public String get(String key) {Jedis jedis = jedisUtils.getJedis();try {if (!jedis.exists(key)) {log.info("key:{}在Redis中查不到数据.", key);} else {return jedis.get(key);}} catch (Exception e) {log.error("Jedis get操作出错", e);} finally {jedisUtils.close(jedis);}return null;}/*** 设置key-value*/public void set(String key, String value) {Jedis jedis = jedisUtils.getJedis();try {jedis.set(key, value);} catch (Exception e) {log.error("Jedis set操作出错", e);} finally {jedisUtils.close(jedis);}}/*** 删除key*/public void delete(String key) {Jedis jedis = jedisUtils.getJedis();try {jedis.del(key);} catch (Exception e) {log.error("Jedis delete操作出错", e);} finally {jedisUtils.close(jedis);}}
}

在上述代码中,我们通过@Autowired 注解将 JedisUtils 对象注入到 JedisClient 类中,以获取 Jedis 资源。然后,我们可以定义一些常见的 Redis 操作方法,例如 get、set 和 delete。

最后,我们可以在需要使用缓存的地方调用 JedisClient 类进行 Redis 操作。例如:

@RestController
public class UserController {@Autowiredprivate JedisClient jedisClient;@GetMapping("/user/{id}")public User getUserById(@PathVariable("id") String id) {String key = "user:" + id;String value = jedisClient.get(key);if (value != null) {return JSON.parseObject(value, User.class);} else {User user = userService.getUserById(id);if (user != null) {jedisClient.set(key, JSON.toJSONString(user));}return user;}}
}

在上述代码中,我们首先根据缓存的 key 值查询 Redis 中是否存在对应的 value 值。如果存在,则直接从 Redis 中获取缓存数据。如果不存在,则从数据库中获取数据,并将数据存入 Redis 中以供下次使用。

三、使用 RedisTemplate 操作 Redis

除了使用 Jedis 进行 Redis 操作外,Spring Boot 还提供了另一种方式:使用 RedisTemplate。下面是使用 RedisTemplate 进行操作的示例代码。

image-20240405200656295

首先,我们需要创建一个 RedisConfig 类,用于配置 RedisTemplate:

@Configuration
public class RedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.timeout}")private Integer timeout;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.database}")private Integer database;@Beanpublic RedisConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);config.setDatabase(database);config.setPassword(RedisPassword.of(password));LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);connectionFactory.setTimeout(timeout);return connectionFactory;}@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);// 设置key和value的序列化方式redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}

在上述代码中,我们通过@Configuration 注解将 RedisConfig 类标识为配置类,并通过@Bean 注解分别注册了 redisConnectionFactory 和 redisTemplate 对象。在 redisTemplate 方法中,我们设置了 key 和 value 的序列化方式,这里使用了 StringRedisSerializer 和 GenericJackson2JsonRedisSerializer。

接下来,我们可以在需要使用缓存的地方注入 RedisTemplate 对象,并调用相应的方法进行 Redis 操作。例如:

@RestController
public class UserController {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@GetMapping("/user/{id}")public User getUserById(@PathVariable("id") String id) {String key = "user:" + id;User user = (User) redisTemplate.opsForValue().get(key);if (user != null) {return user;} else {user = userService.getUserById(id);if (user != null) {redisTemplate.opsForValue().set(key, user);}return user;}}
}

在上述代码中,我们通过 RedisTemplate 的 opsForValue 方法获取 ValueOperations 对象,并调用 get 方法从 Redis 中获取缓存数据。如果数据不存在,则从数据库中

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京东详情API接口请求代码源码(java)

京东详情API接口是用于获取京东商品详细信息的接口&#xff0c;它允许开发者通过发送请求&#xff0c;获取商品的描述、价格、评价等信息。下面是一个关于京东详情API接口的示例文档&#xff0c;包括接口地址、请求参数、响应参数等内容。 京东详情API接口文档 接口地址&#x…

机器学习知识点

1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题&#xff0c;旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征&#xff0c;将鸢尾花分成三个品种&#xff1a;山鸢尾&#xff08;setosa&#xff09;、变色鸢尾&#xff08;versicolor&#xff09;和维吉尼亚…

使用 Go-Ora 连接到 Oracle 数据库

前文 《 一鍵啓動 Oracle 23c Free 》 介绍了如何使用容器技术快速拉起 Oracle 23c 数据库。 这个开发者版本可以很便捷的拉起、测试、销毁&#xff0c;对开发者是非常友好的。 本文将介绍如何使用 Go 语言构建项目&#xff0c;并连接到 Oracle 数据库。 Go 环境配置 本文使用的…

【数据结构与算法】:归并排序和计数排序

1. 归并排序 归并排序是一种效率仅次于快速排序的排序算法。它有非递归和递归两种实现方式(本文只讲述递归实现&#xff0c;非递归实现以后有专门的文章)。 其实&#xff0c;归并排序也叫外排序。它不仅可以对内存中的数据进行排序&#xff0c;还能对文件里的数据排序。 比如&…

LeetCode 使数组连续的最少操作数

地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;困难 题目描述&#xff1a;给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元素替换成 **任意 **整数。 如果 nums 满足以下条件&#xff0c;那么它是 连续的 &#x…

点击上传文件

一、页面样式&#xff1a; &#xff08;1&#xff09;点击前&#xff1a; &#xff08;2&#xff09;点击后&#xff1a; 设计&#xff1a;①自定义elementPlus图标&#xff1b;②使用Tooltip实现鼠标悬浮按钮上出现文字提示&#xff1b;③上传与更换的切换样式&#xff1b;…

Linux 性能分析工具大全

vmstat--虚拟内存统计 vmstat&#xff08;VirtualMeomoryStatistics&#xff0c;虚拟内存统计&#xff09;是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法&#xff1a;vmstat interval times 即每隔 interval 秒采…

从概念到实践:揭开枚举与联合体在数字化创新时代的神秘面纱

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 在编程的世界中&#xff0c;枚举和联合体是两种非常基础且重要的数据结构。它们各自具有独特的特点和用途&#xff0c;为程序员提供…

(一)基于IDEA的JAVA基础12

一维数组 为什么使用数组: 当我们需要存储一系列数据的时候&#xff0c;就需要用到数组&#xff0c;如果不使用数组&#xff0c;我们就要需要一个一个的去声明变量&#xff0c;这样浪费内存空间&#xff0c;同时效率低下。 什么是数组: 数组本身就是一个变量&#xff0c;只…

Redis从入门到精通(六)Redis实战(三)优惠券秒杀

↑↑↑下载测试项目原代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.1 数据表与实体类4.3.2 添加优惠券4.3.2.1 添加普通券代码4.3.2.2 添加秒杀券代码 4.3.3 实现秒杀下单4.3.3.1 秒杀下单逻辑分析4.3.3.2 获取秒杀订单ID4.3.3.3 获取用户ID4.3.3.4 实现秒杀下单 前言 Redis实战…

diffusion model(十五) : IP-Adapter技术小结

infopaperhttps://arxiv.org/pdf/2308.06721.pdfcodehttps://github.com/tencent-ailab/IP-Adapterorg.Tencent AI Lab个人博客地址http://myhz0606.com/article/ip_adapter 1 Motivation 为了对文生图diffusion model进行特定概念的定制&#xff0c;常用LoRA[1]、textual in…

JDK下载及安装说明

1&#xff0e;JDK下载 访问oracle官网&#xff1a;http://www.oracle.com 在首页点击Downloads&#xff0c;进入oracle软件下载页。 在下载页面&#xff0c;点击Java。 选择Java (JDK) for Developers&#xff0c;点击。 在 Java SE Downloads 页面&#xff0c;点击中间的DO…

装机指导。

everything winrar snipaste cmake git tortoisegit tortoisesvn inno setup vs2022 安装的时候注意sdk路径一定要默认&#xff01;&#xff01; 否则你会发现在你的sdk安装路径的根盘符下会多出一个Windows Kits&#xff0c;强迫症接受不了 默认的会跟已有的装在一起…

【Python系列】读取 Excel 第一列数据并赋值到指定列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux的学习之路:4、权限

一、Linux权限的概念 权限我们都熟悉&#xff0c;最常见的就是在看电视时需要vip这个就是权限&#xff0c;然后在Linux就是有两个权限&#xff0c;就是管理员也就是超级用户和普通的用户 命令&#xff1a;su [用户名] 功能&#xff1a;切换用户。 例如&#xff0c;要从root用户…

ZLMediaKit ubantu 下编译

1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init二、依赖库 Debian系(包括ubuntu&#xff09;系统下安装依赖的方法&#xff1a; #除了…

Python-VBA函数之旅-ascii函数

ascii函数在Python中主要用于将对象(特别是字符和字符串)转换为它们的ASCII表示形式。这种转换在处理文本数据、调试代码以及确保文本以 ASCII 格式存储或传输时非常有用。常见应用场景有&#xff1a; 1、调试和文本处理&#xff1a;当处理包含非ASCII字符(如Unicode字符)的文…

景联文科技:为AI大模型提供高质海量训练数据

在全球AI浪潮的推动下&#xff0c;大量训练数据已成为AI算法模型发展和演进中的关键一环。 艾瑞咨询数据显示&#xff0c;包括数据采集、数据处理&#xff08;标注&#xff09;、数据存储、数据挖掘等模块在内的AI基础数据服务市场&#xff0c;将在未来数年内持续增长。 预计到…

算法:完全背包问题dp

文章目录 一、完全背包问题的特征二、定义状态三、状态转移四、降维优化五、参考例题5.1、Acwing&#xff1a;3.完全背包问题5.2、Acwing&#xff1a;900. 整数划分 一、完全背包问题的特征 完全背包问题是动态规划中的一种经典问题&#xff0c;它的主要特征可以总结如下&…

ES6中 Promise的详细讲解

文章目录 一、介绍状态特点流程 二、用法实例方法then()catchfinally() 构造函数方法all()race()allSettled()resolve()reject() 三、使用场景# 参考文献 一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;…