当前位置: 首页 > web >正文

[Java实战]Spring Boot 整合 Redis(十八)

[Java实战]Spring Boot 整合 Redis(十八)

在现代的分布式应用开发中,Redis 作为一种高性能的键值存储数据库,被广泛用于缓存、消息队列、排行榜等多种场景。Spring Boot 提供了强大的支持,使得整合 Redis 变得非常简单。本文将详细介绍如何在 Spring Boot 项目中整合 Redis,从基础配置到高级用法,帮助你快速上手并深入掌握。

一、Redis 简介

Redis(Remote Dictionary Server,远程字典服务)是一个开源的键值存储数据库,通常用作数据库、缓存或消息代理。它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。

Redis 的主要特点

  • 高性能:每秒可处理数十万次读写操作。
  • 支持丰富的数据类型:不仅支持简单的 key-value 类型,还支持 list、set、zset(sorted set)等复杂数据类型。
  • 原子操作:所有操作都是原子性的,保证了数据的一致性。
  • 持久化:支持 RDB(快照)和 AOF(追加文件)两种持久化方式。

二、Spring Boot 整合 Redis

1. 添加依赖

在 Spring Boot 项目中,整合 Redis 非常简单。首先,需要在 pom.xml 文件中添加 Redis 相关的依赖。

<dependencies><!-- Spring Boot Starter Data Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
</dependencies>

2. 配置 Redis

application.ymlapplication.properties 文件中配置 Redis 的连接信息。

application.yml
spring:redis:host: localhostport: 6379password: your_password # 如果有密码database: 0 # 数据库编号(默认为 0)timeout: 5000ms # 连接超时时间
application.properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_password # 如果有密码
spring.redis.database=0 # 数据库编号(默认为 0)
spring.redis.timeout=5000ms # 连接超时时间

3. 配置 RedisTemplate

RedisTemplate 是 Spring 提供的用于操作 Redis 的模板类,它封装了底层的 Jedis 或 Lettuce 客户端,提供了丰富的 API。

配置 RedisTemplate
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);// 设置序列化器Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);template.setDefaultSerializer(serializer);return template;}
}

4. 使用 RedisTemplate

存储和获取数据
@Service
public class RedisService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void set(String key, Object value) {redisTemplate.opsForValue().set(key, value);}public Object get(String key) {return redisTemplate.opsForValue().get(key);}
}
示例:缓存用户信息
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate RedisService redisService;@PostMapping("/saveUser")public void saveUserInfo(User User){User u =  new User();u.setId("3");u.setAge(25);u.setEmail("alice@example.com");u.setName("Alice");userService.saveUserToRedis(u);}
}

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

三、高级用法

1. Redis 消息订阅与发布

Redis 支持发布/订阅模式,可以用于实现简单的消息队列。

配置消息监听器
@Component
public class RedisMessageListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String messageStr = new String(message.getBody());System.out.println("Received message: " + messageStr);}
}
配置订阅
@Configuration
public class RedisMessageConfig {@Beanpublic RedisMessageListenerAdapter messageListener(RedisMessageListener listener) {return new RedisMessageListenerAdapter(listener);}@Beanpublic StringRedisTemplate template(RedisConnectionFactory connectionFactory) {return new StringRedisTemplate(connectionFactory);}@Beanpublic RedisPubSubListener redisPubSubListener() {return new RedisPubSubListener();}@Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,RedisMessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.addMessageListener(listenerAdapter, new PatternTopic("chat"));return container;}
}
发布消息
@Service
public class RedisPubSubService {@Autowiredprivate StringRedisTemplate template;public void sendMessage(String channel, String message) {template.convertAndSend(channel, message);}
}

2. Redis 分布式锁

在分布式系统中,分布式锁是一个常见的需求。Redis 提供了基于 SETNX 命令的锁机制。

实现分布式锁
@Service
public class RedisLockService {@Autowiredprivate StringRedisTemplate template;public boolean tryLock(String key, String value, long expireTime) {Boolean result = template.opsForValue().setIfAbsent(key, value, expireTime, TimeUnit.MILLISECONDS);return result != null && result;}public void releaseLock(String key, String value) {String currentValue = template.opsForValue().get(key);if (value.equals(currentValue)) {template.delete(key);}}
}
使用分布式锁
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate RedisLockService redisLockService;@PostMapping("/create")public ResponseEntity<?> createOrder(@RequestBody Order order) {String lockKey = "order:lock";String lockValue = UUID.randomUUID().toString();if (redisLockService.tryLock(lockKey, lockValue, 30000)) {try {// 处理订单逻辑orderService.createOrder(order);} finally {redisLockService.releaseLock(lockKey, lockValue);}} else {return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("Too many requests");}return ResponseEntity.ok("Order created successfully");}
}

四、常见问题与解决方案

1. Redis 连接超时

原因:Redis 服务器响应慢或网络问题。

解决方案

  • 增加连接超时时间:
    spring:redis:timeout: 10000ms
    
  • 检查 Redis 服务器性能,优化配置。

2. 序列化问题

原因:默认的序列化方式可能导致存储的数据难以理解。

解决方案

  • 使用自定义的序列化器,如 Jackson2JsonRedisSerializer
    Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
    template.setDefaultSerializer(serializer);
    

3. 数据丢失

原因:Redis 默认不开启持久化。

解决方案

  • 开启 RDB 或 AOF 持久化:
    appendonly yes
    save 900 1
    save 300 10
    save 60 10000
    

五、总结

本文详细介绍了 Spring Boot 整合 Redis 的过程,从基础配置到高级用法,包括消息订阅与发布、分布式锁等。通过合理使用 Redis,可以显著提升应用的性能和扩展性。希望本文能帮助你更好地理解和使用 Spring Boot 整合 Redis。

如果你在使用过程中遇到任何问题,欢迎在评论区留言交流。感谢你的阅读,希望这篇文章对你有所帮助!

OF 持久化:

appendonly yes
save 900 1
save 300 10
save 60 10000

五、总结

本文详细介绍了 Spring Boot 整合 Redis 的过程,从基础配置到高级用法,包括消息订阅与发布、分布式锁等。通过合理使用 Redis,可以显著提升应用的性能和扩展性。希望本文能帮助你更好地理解和使用 Spring Boot 整合 Redis。

如果你在使用过程中遇到任何问题,欢迎在评论区留言交流。感谢你的阅读,希望这篇文章对你有所帮助!

http://www.xdnf.cn/news/5606.html

相关文章:

  • Browserless 快速上手
  • FFmpeg 与 C++ 构建音视频处理全链路实战(一)—— 环境配置与视频解封装
  • ctfshow——web入门351~356
  • 【Pandas】pandas DataFrame cummax
  • web 自动化之 selenium 下拉鼠标键盘文件上传
  • FreeRTOS学习记录(变量命名规则全解、文件介绍)
  • 制造业IT管理方法论:柔性变更与数据治理的融合实践
  • 视觉-语言-动作模型:概念、进展、应用与挑战(上)
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
  • ActiveMQ 高级特性:延迟消息与优先级队列实战(一)
  • 【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器
  • 15.three官方示例+编辑器+AI快速学习webgl_buffergeometry_instancing
  • PINN应用案例:神经网络求解热扩散方程高质量近似解
  • Python的安装使用
  • 深度策略梯度算法PPO
  • 《Asp.net Mvc 网站开发》复习试题
  • Java SpringMVC 异常处理:保障应用健壮性的关键策略
  • Spring Bean有哪几种配置方式?
  • 计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 09.天空和背景
  • 鸿蒙(HarmonyOS)应用开发入门教程
  • ISSCC 25 14.4 性能达51.6TFLOPs/W的全数据路径存内计算宏单元,逼近稀疏性极限,应用于复合人工智能时损失低于2-30
  • kafka消费组
  • 接口自动化测试设计思路--设计实战
  • 每日一题洛谷P8662 [蓝桥杯 2018 省 AB] 全球变暖c++
  • 专题二:二叉树的深度搜索(二叉树剪枝)
  • tryhackme——Lateral Movement and Pivoting
  • 状态压缩动态规划:用二进制“魔法”破解组合难题
  • 利用D435i相机进行SLAM实现建图的关键环节-----Kalibr标定工具以及常见的问题调试
  • idea查看pom文件依赖
  • qtcreator导入帮助文档