基于SpringBoot的Redis开发实战教程

简介: Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。

基于Spring Boot的Redis开发实战教程

Redis作为一个高性能的内存数据库,广泛应用于缓存、会话管理、消息队列等场景中。Spring Boot作为一个简化Spring应用开发的框架,与Redis的结合能够极大提升应用的性能和可扩展性。本文将详细介绍如何在Spring Boot中集成Redis,并实现常见的开发场景。

一、准备工作

在开始之前,请确保已安装以下环境:

  1. Java Development Kit (JDK) :建议使用JDK 8或以上版本。
  2. Maven:构建Spring Boot项目的依赖管理工具。
  3. Redis Server:可以在本地或远程服务器上运行的Redis实例。

二、创建Spring Boot项目

1. 创建Maven项目

可以使用Maven或Spring Initializr创建一个Spring Boot项目。以下是Maven的项目结构:

spring-boot-redis
|-- src
|   |-- main
|   |   |-- java
|   |   |   |-- com.example.redis
|   |   |   |   |-- RedisApplication.java
|   |   |-- resources
|   |       |-- application.properties
|-- pom.xml
​

2. 配置Maven依赖

pom.xml中添加Spring Boot和Redis的依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <!-- Jedis or Lettuce as Redis Client -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>
​

解释:spring-boot-starter-web 提供了构建Web应用所需的核心依赖,spring-boot-starter-data-redis 是Spring Boot对Redis集成的核心依赖包,您可以选择使用Jedis或Lettuce作为Redis客户端。

三、配置Redis连接

application.properties中配置Redis连接信息:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_password
spring.redis.timeout=5000
​

解释:spring.redis.host 指定Redis服务器的主机地址,spring.redis.port 指定Redis的端口,spring.redis.password 用于设置Redis的访问密码,spring.redis.timeout 是连接Redis的超时时间(以毫秒为单位)。

四、创建Redis操作类

1. 定义Redis配置类

package com.example.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new StringRedisSerializer());

        template.afterPropertiesSet();
        return template;
    }
}
​

解释:RedisConfig 配置类定义了一个 RedisTemplate Bean,RedisTemplate 是Spring提供的用于操作Redis的模板类。通过设置序列化器,我们可以确保Redis存储和读取的键和值都是字符串形式,避免因序列化问题导致的数据不一致。

2. 创建Redis服务类

package com.example.redis.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class RedisService {

    @Autowired
    private 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);
    }

    // 设置键值并设置过期时间
    public void setWithExpire(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    // 删除键
    public void delete(String key) {
        redisTemplate.delete(key);
    }
}
​

解释:RedisService 提供了几个常见的Redis操作方法,如设置键值、获取键值、设置过期时间、删除键等。通过这些方法,您可以轻松地将数据存储到Redis中并进行管理。

五、使用Redis实现缓存功能

1. 配置缓存

application.properties中启用缓存:

spring.cache.type=redis
​

解释:这行配置指定使用Redis作为缓存类型。

2. 使用缓存注解

在服务类中使用缓存注解来管理缓存:

package com.example.redis.service;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "user", key = "#id")
    public User getUserById(Long id) {
        // 模拟数据库操作
        return findUserById(id);
    }

    private User findUserById(Long id) {
        // 假设此处为数据库查询操作
        return new User(id, "user" + id);
    }
}
​

解释:@Cacheable 注解标记的方法会首先检查缓存,如果缓存中存在数据则直接返回,否则会执行方法体并将结果存入缓存。value 是缓存的命名空间,key 是缓存的键。

六、集成Redis消息队列

Redis不仅仅是一个缓存数据库,它还支持发布/订阅消息机制,可以用于实现消息队列。

1. 配置消息监听器

首先在 RedisConfig中添加消息监听器配置:

package com.example.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;

@Configuration
public class RedisMessageConfig {

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new ChannelTopic("myTopic"));
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(MyMessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }
}
​

解释:RedisMessageListenerContainer 是消息监听容器,MessageListenerAdapter 将订阅者与消息处理方法绑定。ChannelTopic 指定了监听的主题。

2. 创建消息订阅者

package com.example.redis.service;

import org.springframework.stereotype.Service;

@Service
public class MyMessageSubscriber {

    public void onMessage(String message) {
        System.out.println("Received message: " + message);
    }
}
​

解释:MyMessageSubscriber 是消息订阅者类,onMessage 方法将处理接收到的消息。

3. 发布消息

在其他服务类中,可以通过以下方式发布消息:

package com.example.redis.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class MyMessagePublisher {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void publish(String message) {
        redisTemplate.convertAndSend("myTopic", message);
    }
}
​

解释:convertAndSend 方法用于将消息发布到指定的主题(myTopic),所有订阅该主题的监听器都会收到此消息。

七、总结

通过本教程,您学会了如何在Spring Boot中集成Redis并实现常见的开发场景,包括基本的CRUD操作、缓存管理、以及消息队列的实现。每一步都详细解释了相关代码及其作用,使您能够更好地理解和掌握这些技术。

Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。

目录
相关文章
|
5月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
373 7
|
6月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
551 0
分布式爬虫框架Scrapy-Redis实战指南
|
5月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
3月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
224 39
|
3月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
839 7
|
4月前
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
427 4
|
4月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
382 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
3月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
318 0
|
3月前
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
214 0
|
5月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
456 5