Redis在Spring Boot中的应用详细讲解和案例示范

news2024/9/21 11:15:08

深入理解Redis在Spring Boot中的应用

Redis 作为一种高性能的键值数据库,常被用于缓存、会话管理和其他需要快速访问的数据存储场景中。在 Spring Boot 项目中集成 Redis,可以显著提高应用的性能和可扩展性。本篇文章将深入探讨如何在 Spring Boot 中使用 Redis,涵盖常见用法、Maven 依赖、配置说明,以及使用电商交易系统为案例的实际应用示范。


第1章:Redis 的基本概念回顾

1.1 什么是 Redis

Redis(Remote Dictionary Server)是一个开源的内存数据库,用于缓存和消息代理。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合、位图、HyperLogLog 和 Geospatial 索引等。Redis 的速度非常快,支持持久化,将内存中的数据存储在磁盘上,并在重启时加载。

1.2 Redis 的核心特点
  • 性能优越:Redis 通过将数据存储在内存中,并通过有序的数据结构实现高效的数据操作,能够达到非常高的读写性能。
  • 数据持久化:Redis 提供了 RDB(Redis Database File)和 AOF(Append Only File)两种持久化机制,可以根据需要选择合适的方式来保证数据的持久化。
  • 丰富的数据类型:支持多种数据类型,包括字符串、哈希、列表、集合和有序集合等,能够灵活地满足不同的业务场景需求。

第2章:在 Spring Boot 中集成 Redis

2.1 添加 Maven 依赖

在 Spring Boot 中使用 Redis,首先需要在 pom.xml 中添加必要的 Maven 依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.0.1</version>
</dependency>

spring-boot-starter-data-redis 是 Spring 提供的 Redis 集成起步依赖,jedis 是 Redis 的 Java 客户端,这里可以根据需求选择其他客户端,比如 Lettuce

2.2 Redis 配置

在 Spring Boot 项目中集成 Redis 时,合理配置 Redis 的连接参数和序列化方式是确保 Redis 高效运行的关键。以下是 application.yml 中 Redis 配置参数的详细说明。

2.2.1. Redis 配置参数详解
spring:
  redis:
    host: localhost
    port: 6379
    password: yourpassword
    timeout: 6000
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: -1ms

我们逐个分析这些参数的具体作用:

  • spring.redis.host: Redis 服务器的主机名或 IP 地址。默认情况下为 localhost,表示连接本地的 Redis 实例。如果 Redis 部署在远程服务器上,则需要填写该服务器的 IP 地址或域名。
  • spring.redis.port: Redis 服务器的端口号,默认为 6379。当 Redis 使用非默认端口时,需要修改此配置。
  • spring.redis.password: Redis 实例的密码。如果 Redis 设置了密码保护,需要在此配置项中填写相应的密码。如果未设置密码,则此项可以为空。
  • spring.redis.timeout: 连接超时时间(以毫秒为单位)。该参数用于设置应用与 Redis 服务器之间的连接超时值。在高并发的情况下,合理的超时设置可以防止 Redis 连接过载。示例中的 6000 表示超时为 6 秒。
  • spring.redis.lettuce.pool.max-active: 最大活跃连接数。这个参数控制 Redis 连接池中同时能够分配的最大连接数。如果超过此数值,新请求将会被阻塞,直到有空闲连接可用。默认值为 8,具体值应根据业务量进行调整。
  • spring.redis.lettuce.pool.max-idle: 最大空闲连接数。控制 Redis 连接池中最大保持空闲的连接数,空闲连接是那些当前没有使用但保持在池中的连接。这个值不能大于 max-active,合理的设置可以减少连接的创建和销毁开销。
  • spring.redis.lettuce.pool.min-idle: 最小空闲连接数。这个参数用于确保在 Redis 连接池中始终有一定数量的空闲连接以备使用。如果空闲连接低于该数值,连接池将会创建新的连接。
  • spring.redis.lettuce.pool.max-wait: 连接最大等待时间(以毫秒为单位)。当没有可用连接时,请求等待的最长时间,超过该时间将会抛出异常。-1ms 表示无限等待时间。
2.2.2 Redis 配置的优化建议
  • 优化连接数: 对于高并发场景,建议根据应用的并发量调节 max-activemax-idle 的值。通过合理调整连接池的配置,能够避免 Redis 服务器过载,同时提高连接的复用效率。
  • 超时时间的合理设置: 根据网络延迟和 Redis 服务器的处理能力,适当调整 timeout 参数。过短的超时可能导致连接中断,过长则可能拖慢系统响应。
  • 密码保护: 生产环境建议设置密码,保障 Redis 数据安全。尤其在分布式部署中,防止未经授权的连接。

第3章:在电商交易系统中的 Redis 应用场景

3.1 用户会话管理

在电商系统中,用户的会话管理是一个非常重要的功能。通过 Redis 存储会话数据,可以实现分布式的会话管理,使得用户在不同的服务器上进行操作时,仍然能够保持会话的一致性。

@Component
public class SessionService {

    private final RedisTemplate<String, Object> redisTemplate;

    @Autowired
    public SessionService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void saveUserSession(String sessionId, User user) {
        redisTemplate.opsForValue().set("session:" + sessionId, user);
    }

    public User getUserSession(String sessionId) {
        return (User) redisTemplate.opsForValue().get("session:" + sessionId);
    }

    public void deleteUserSession(String sessionId) {
        redisTemplate.delete("session:" + sessionId);
    }
}

在上述代码中,SessionService 通过 RedisTemplate 将用户会话信息保存到 Redis 中。我们使用 opsForValue 操作 Redis 的字符串类型,存储的键为 session:{sessionId},值为用户对象。

3.2 商品缓存

为了减少数据库的访问次数,提高商品信息的读取速度,可以将热门商品信息缓存到 Redis 中。

@Component
public class ProductCacheService {

    private final RedisTemplate<String, Object> redisTemplate;

    @Autowired
    public ProductCacheService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void cacheProduct(Product product) {
        redisTemplate.opsForHash().put("product:" + product.getId(), "data", product);
    }

    public Product getCachedProduct(Long productId) {
        return (Product) redisTemplate.opsForHash().get("product:" + productId, "data");
    }

    public void deleteProductCache(Long productId) {
        redisTemplate.opsForHash().delete("product:" + productId, "data");
    }
}

在该示例中,ProductCacheService 使用 Redis 的哈希数据结构存储商品信息,通过 opsForHash 操作 Redis 的哈希类型,键为 product:{productId},值存储为商品对象。

第4章:Redis 常见用法讲解

RedisTemplate 是 Spring 提供的一个强大的工具类,用于执行 Redis 的各种操作。它支持多种 Redis 数据类型的操作,如字符串、哈希、列表、集合和有序集合。使用 RedisTemplate 可以简化 Redis 操作,开发者只需专注于业务逻辑,而不必直接处理底层 Redis API。

4.1 RedisTemplate 配置示例
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        
        // 设置 key 的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        
        // 设置 value 的序列化方式
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        // 设置 hash key 的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        
        // 设置 hash value 的序列化方式
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        template.afterPropertiesSet();
        return template;
    }
}
4.2 RedisTemplate 参数详细解析
  • RedisConnectionFactory: 连接 Redis 的工厂接口。RedisConnectionFactory 提供了 LettuceJedis 两种实现。在上面的代码中,factory 参数即为通过 spring.redis 的配置自动注入的连接工厂。
  • template.setKeySerializer(new StringRedisSerializer()): 设置键的序列化方式。StringRedisSerializer 使用字符串方式对键进行序列化,确保存入 Redis 的键都是可读的字符串格式。
  • template.setValueSerializer(new GenericJackson2JsonRedisSerializer()): 设置值的序列化方式。GenericJackson2JsonRedisSerializer 是一个通用的 JSON 序列化工具,能够将对象转换为 JSON 格式存储到 Redis 中。使用 JSON 序列化可以提高可读性,并且支持复杂对象的存储。
  • template.setHashKeySerializer(new StringRedisSerializer()): 设置哈希表中键的序列化方式,通常使用字符串序列化。
  • template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()): 设置哈希表中值的序列化方式,支持将复杂对象以 JSON 格式存储在 Redis 的哈希结构中。
4.3 RedisTemplate 的常用方法
  • opsForValue(): 用于操作 Redis 中的字符串类型(String),包括 getsetincrement 等操作。

    redisTemplate.opsForValue().set("key", "value");
    String value = redisTemplate.opsForValue().get("key");
    
  • opsForHash(): 用于操作 Redis 中的哈希类型(Hash)。可以对哈希表的键和值进行操作。

    redisTemplate.opsForHash().put("hashKey", "field", "value");
    Object value = redisTemplate.opsForHash().get("hashKey", "field");
    
  • opsForList(): 用于操作 Redis 中的列表类型(List),支持对列表的左右两端进行插入、弹出等操作。

    redisTemplate.opsForList().leftPush("listKey", "value");
    String value = redisTemplate.opsForList().rightPop("listKey");
    
  • opsForSet(): 用于操作 Redis 中的集合类型(Set),支持无序集合的增删查操作。

    redisTemplate.opsForSet().add("setKey", "value1", "value2");
    Set<Object> members = redisTemplate.opsForSet().members("setKey");
    
  • opsForZSet(): 用于操作 Redis 中的有序集合类型(Sorted Set),支持有序集合的增删查操作。

    redisTemplate.opsForZSet().add("zsetKey", "value", score);
    Set<Object> range = redisTemplate.opsForZSet().range("zsetKey", 0, -1);
    
4.4 RedisTemplate 使用建议
  • 序列化方式选择: 默认情况下,RedisTemplate 使用 JdkSerializationRedisSerializer 进行序列化,该方式会对数据进行字节码序列化,容易造成可读性差且不跨语言。建议使用 JSON 序列化工具,如 Jackson2JsonRedisSerializerGenericJackson2JsonRedisSerializer,确保数据的可读性和兼容性。
  • 类型安全: 使用 RedisTemplate 时,应确保键和值的类型一致。如果操作哈希表或集合,键和值的序列化方式可能不同,务必使用 setKeySerializersetHashKeySerializer 来分别设置键的序列化方式。

第5章:Redis 配置与优化

5.1 Redis 配置最佳实践

为了保证 Redis 在 Spring Boot 项目中的最佳性能,需要合理配置 Redis 连接池、序列化方式等参数。

  • 连接池配置:通过配置 lettuce.pooljedis.pool 参数,控制 Redis 连接的最大活动数、最大空闲数和最小空闲数,以防止过多的连接占用系统资源。
  • 序列化配置:推荐使用 JSON 或者 Protostuff 作为 Redis 数据的序列化方式,以减少序列化和反序列化的性能开销。
5.2 Redis 性能优化

在 Redis 的性能优化中,可以考虑以下几个方面:

  • 缓存失效策略:设置合理的缓存失效时间,避免缓存雪崩和缓存穿透的问题。
  • 内存使用优化:定期清理过期的数据,并通过 maxmemory-policy 配置内存淘汰策略。
  • 连接数优化:根据业务量的变化,动态调整 Redis 连接池的大小,确保 Redis 能够处理高并发请求。

第6章:时序图示例

为了帮助读者更好地理解 Redis 在 Spring Boot 中的操作流程,下面提供一个使用 Redis 缓存用户会话的时序图。
在这里插入图片描述

该时序图展示了用户登录请求在 Spring Boot 应用中如何通过 Redis 进行会话管理的流程。


第7章:总结

通过本篇文章,我们深入探讨了 Redis 在 Spring Boot 中的应用场景,并结合电商交易系统提供了详细的代码示例。Redis 作为一个高性能的内存数据库,可以极大地提升 Spring Boot 应用的性能和扩展性。在实际应用中,合理地配置。

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

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

相关文章

几千块考的证,公司根本不认,「PMP证书」是智商税吗?

有很多小伙伴们担心&#xff0c;自己的公司并不认可PMP证书&#xff0c;觉得考这个证书没什么用。 真的是这样吗&#x1f914;&#xff1f;但据观察来看&#xff0c;PMP主要是北上广深等发达城市的认可度更高&#xff0c;有75%都是来自于北上广深以及江苏、浙江等经济发达地区。…

内裤洗衣机是鸡肋吗?五大品质拔尖的佳品一览

当代年轻人对生活品质的追求日益迫切&#xff0c;现在许多用户都开始注重整理和清洗衣物&#xff0c;举例来说&#xff0c;通常会把婴儿的小件衣物分开洗&#xff0c;将不同类型的衣物分开洗&#xff0c;甚至是将内衣也分开洗&#xff0c;主要由于大型洗衣机的卫生问题又堪忧&a…

Android OpenGLES开发:EGL环境搭建

努力&#xff0c;不是为了要感动谁&#xff0c;也不是要做给哪个人看&#xff0c;而是要让自己随时有能力跳出自己厌恶的圈子&#xff0c;并拥有选择的权利&#xff0c;用自己喜欢的方式过一生&#xff01; EGL是什么&#xff1f; 谈到openGL开发我们就不得不说EGL&#xff0c…

eetrade:黄金分哪几种,什么金最好

随着黄金价格的持续走高&#xff0c;越来越多的消费者开始关注黄金的购买。市场上出现了多种黄金类型&#xff0c;如足金、千足金、万足金、3D硬金、古法黄金等&#xff0c;让人感到困惑。本文将为您详细解析这些黄金的种类及其含金量&#xff0c;帮助您更好地理解和选择。 一…

备忘录在哪添加图片?桌面备忘录能保存图片吗

在快节奏的生活中&#xff0c;备忘录app已成为我们日常工作和学习的得力助手。它帮助我们规划任务、提醒重要事件&#xff0c;确保一切井然有序。但备忘录的用途远不止于此&#xff0c;随着科技的发展&#xff0c;现在的备忘录功能已经越来越强大。 很多人习惯在备忘录中记录文…

2.门锁_STM32_舵机设备实现

概述 需求来源&#xff1a; 门锁的开启和关闭&#xff0c;就是电机来控制。这里不进行实际门锁机械结构的设计&#xff0c;选择用舵机或者电机转动一定的角度&#xff0c;就代表门锁开启。 舵机开发整体思路&#xff1a; 使用STM32裸机开发舵机&#xff0c;使得舵机可以实现…

悟空有枪:玩家解包文件发现《黑神话》有AK47

今日&#xff0c;Reddit的《黑神话》子版的一位玩家分享了本作的全新震撼内容&#xff1a;AK47。据他描述&#xff0c;这是一位中国玩家解包发现的&#xff0c;页面描述十分搞笑&#xff1a;不能化身白衣秀士&#xff0c;捻诀念咒&#xff0c;什么也不会发生&#xff0c;快慢机…

【有啥问啥】抽象语法树(Abstract Syntax Tree, AST)的原理详解

抽象语法树&#xff08;Abstract Syntax Tree, AST&#xff09;的原理详解 引言 在编译器设计、编程语言解析以及静态分析工具中&#xff0c;抽象语法树&#xff08;AST&#xff09;是一个至关重要的概念。AST是一种树状结构&#xff0c;用于表示源代码的抽象语法&#xff0c…

ubuntu 常见问题的收录

在使用过程中&#xff0c;发现ubuntu的问题一点不必windows少。因为每次遇到问题都需要要上网找&#xff0c;所以收集起来之后就会方便一些。 版本体验 24.04&#xff1a;整体的风格大变样&#xff0c;更趋近于“现代化”&#xff1f;反正我是更喜欢了 &#x1f604;。就着风…

PAT.7-1 按格式合并两个链表

题目 解题思路 题目一看是和链表相关的&#xff0c;而且是两个链表&#xff0c;那肯定核心思路和双指针相关了。 我们来一步步拆分问题&#xff1a; 首先我们要把给我们的链表构建出来&#xff0c;所以需要一个Node类&#xff0c;以及一个buildNode的方法。那么输入给我们的是…

CAS理解和说明

目录 1.CAS是什么? 2.CAS的应用场景 2.1 实现原子类 2.2 实现自旋锁 3.CAS的典型问题:ABA问题 1.CAS是什么? CAS:全称compare and swap(比较并交换) 我们假设内存中的原始数据V&#xff0c;旧的预期值A&#xff0c;需要修改的新值B 1.比较A与V是否相等&#xff08;比较…

EmguCV学习笔记 VB.Net 9.2 VideoWriter类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Android Camera 之 CameraInfo 编码模板(前后置摄像头理解、摄像头图像的自然方向理解)

一、Camera.CameraInfo Camera.CameraInfo 是用于获取设备上摄像头信息的一个类&#xff0c;它提供摄像头的各种详细信息&#xff0c;例如&#xff0c;摄像头的方向、是否支持闪光灯等&#xff0c;以下是它的常用属性 static int CAMERA_FACING_BACK&#xff1a;表示设备的后置…

kubernetes 中 利用yaml文件部署应用

目录 1 用yaml文件部署应用有以下优点 1.1 声明式配置&#xff1a; 1.2 灵活性和可扩展性&#xff1a; 1.3 与工具集成&#xff1a; 2 资源清单参数介绍 2.1 获得资源帮助指令explain 2.2 编写示例 2.2.1 示例1&#xff1a;运行简单的单个容器pod 2.2.2 示例2&#xff1a;运行…

二叉树 - 最大二叉树

654. 最大二叉树 方法一 /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)* }*/ /*** param…

java整合Redission

1.maven仓库查询Redisson并倒入项目 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.35.0</version> </dependency> 2.配置文件&#xff08;采用yml配置方式&…

江协科技STM32学习- P9 OLED调试工具

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

2024年9月5日历史上的今天大事件早读

1885年9月5日 左宗棠病逝福州 1894年9月5日 中国古文字学家容庚出生 1905年9月5日 在中国土地上进行的日俄战争结束 1919年9月5日 可口可乐公司成立 1929年9月5日 上海沙逊大厦落成 1937年9月5日 最大一次纳粹集会在纽伦堡举行 1939年9月5日 汪伪政权设立特务组织“七十六…

vue3安装sass时报错:Embedded Dart Sass couldn‘t find the embedded compiler executable

vue3安装sass&#xff1a; npm install sass --save-dev 引用 <template><div class"c1"><h1>hello</h1></div> </template> <style lang"scss">.c1{background-color:red;h1{color:yellow;}} </style>报…

通信算法之230: 5G随机接入PRACH及长度计算

在介绍超远覆盖特性之前&#xff0c;先需了解一下终端接入网络的基本过程。在任何情况下&#xff0c;终端同网络建立通信&#xff0c;都需通过RACH(随机接入信道)向网络发送一个报文来向系统申请一条信令信道&#xff0c;这就是随机接入的过程。根据3GPP 5G R15标准&#xff0c…