SpringBoot项目中Redis的使用

news2025/5/24 14:19:02

在Spring Boot项目中使用Redis作为缓存或数据存储是非常常见的场景。以下是详细的实现步骤和示例代码:

一、添加依赖

pom.xml中添加Spring Data Redis依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池依赖(可选但推荐) -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

二、配置Redis连接信息

application.ymlapplication.properties中配置Redis服务器信息:

spring:
  redis:
    host: localhost       # Redis服务器地址
    port: 6379            # Redis服务器端口
    password:             # Redis密码(如果有)
    database: 0           # 使用的数据库索引(0-15)
    timeout: 3000ms       # 连接超时时间
    lettuce:              # 使用Lettuce连接池(默认)
      pool:
        max-active: 8     # 最大连接数
        max-wait: -1ms    # 最大等待时间
        max-idle: 8       # 最大空闲连接数
        min-idle: 0       # 最小空闲连接数

三、配置RedisTemplate(可选)

默认情况下,Spring Boot会自动配置StringRedisTemplate(键值为String类型)。如果需要自定义序列化方式或操作对象类型,可配置RedisTemplate

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        
        // 设置键的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        // 设置值的序列化方式(使用JSON序列化)
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        // 设置哈希键的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        // 设置哈希值的序列化方式
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        template.afterPropertiesSet();
        return template;
    }
}

四、使用RedisTemplate操作Redis

以下是常见的Redis操作示例:

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 void set(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    // 获取值
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 删除键
    public Boolean delete(String key) {
        return redisTemplate.delete(key);
    }

    // 判断键是否存在
    public Boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }

    // 设置过期时间
    public Boolean expire(String key, long timeout, TimeUnit unit) {
        return redisTemplate.expire(key, timeout, unit);
    }

    // 操作哈希表
    public void hset(String key, String hashKey, Object value) {
        redisTemplate.opsForHash().put(key, hashKey, value);
    }

    public Object hget(String key, String hashKey) {
        return redisTemplate.opsForHash().get(key, hashKey);
    }

    // 操作列表
    public Long lpush(String key, Object value) {
        return redisTemplate.opsForList().leftPush(key, value);
    }

    public Object rpop(String key) {
        return redisTemplate.opsForList().rightPop(key);
    }

    // 操作集合
    public Long sadd(String key, Object... values) {
        return redisTemplate.opsForSet().add(key, values);
    }

    // 操作有序集合
    public Boolean zadd(String key, Object value, double score) {
        return redisTemplate.opsForZSet().add(key, value, score);
    }
}

五、使用@Cacheable注解实现缓存

Spring提供了@Cacheable@CacheEvict等注解简化缓存操作:

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

@Service
public class UserService {

    // @Cacheable:先从缓存中查找,不存在则执行方法并缓存结果
    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        // 模拟从数据库查询
        System.out.println("查询数据库: " + id);
        return new User(id, "name" + id);
    }

    // @CacheEvict:清除缓存
    // @CacheEvict(value = "users", key = "#id")
    // public void deleteUser(Long id) {
    //     // 删除数据库记录
    // }
}

需要在主应用类上添加@EnableCaching注解启用缓存功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

六、配置Redis缓存管理器(可选)

如果需要自定义缓存配置(如过期时间),可配置RedisCacheManager

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        // 默认缓存配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10))  // 默认10分钟过期
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .disableCachingNullValues();

        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .withCacheConfiguration("users", config.entryTtl(Duration.ofHours(1)))  // 自定义缓存空间
                .build();
    }
}

七、Redis事务与管道

RedisTemplate支持事务和管道操作:

// 事务操作示例
redisTemplate.execute(new SessionCallback<Object>() {
    @Override
    public <K, V> Object execute(RedisOperations<K, V> operations) throws DataAccessException {
        operations.multi();  // 开启事务
        operations.opsForValue().set((K) "key1", (V) "value1");
        operations.opsForValue().set((K) "key2", (V) "value2");
        return operations.exec();  // 执行事务
    }
});

// 管道操作示例(批量执行命令)
List<Object> results = redisTemplate.executePipelined(new RedisCallback<Object>() {
    @Override
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
        StringRedisConnection stringRedisConn = (StringRedisConnection) connection;
        for (int i = 0; i < 1000; i++) {
            stringRedisConn.set("key" + i, "value" + i);
        }
        return null;
    }
});

八、Redis哨兵与集群配置

如果使用Redis Sentinel或Cluster,需要修改配置:

# Sentinel配置
spring:
  redis:
    sentinel:
      master: mymaster  # 主节点名称
      nodes: 192.168.1.1:26379,192.168.1.2:26379  # Sentinel节点列表

# Cluster配置
spring:
  redis:
    cluster:
      nodes: 192.168.1.1:7000,192.168.1.2:7001,192.168.1.3:7002  # 集群节点列表
    password: yourpassword

九、注意事项

  1. 序列化问题
    • 默认使用JDK序列化(JdkSerializationRedisSerializer),建议使用JSON序列化(如GenericJackson2JsonRedisSerializer)提高可读性。
  2. 缓存穿透/雪崩/击穿
    • 缓存穿透:查询不存在的数据,可缓存空值或布隆过滤器。
    • 缓存雪崩:大量缓存同时过期,可设置随机过期时间。
    • 缓存击穿:热点key过期,可使用互斥锁或设置永不过期。
  3. 性能监控
    • 使用Redis自带的INFO命令或第三方工具(如RedisInsight)监控内存使用、QPS等指标。

以上代码和配置覆盖了Spring Boot集成Redis的常见场景,你可以根据项目需求选择合适的方式使用Redis。

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

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

相关文章

Canvas设计图片编辑器全讲解(一)Canvas基础(万字图文讲解)

一、前序 近两年AI发展太过迅速&#xff0c;各类AI产品层出不穷&#xff0c;AI绘图/AI工作流/AI视频等平台的蓬勃发展&#xff0c;促使图片/视频等复杂内容的创作更加简单&#xff0c;让更多普通人有了图片和视频创作的机会。另一方面用户内容消费也逐渐向图片和视频倾斜。在“…

利用Qt绘图随机生成带多种干扰信息的数字图片

背景 在学习AutoML或ML的过程中&#xff0c;需要一些图片类型的数据做分类预测训练&#xff0c;于是想到尝试最简单的数字识别&#xff0c;且单个数字的识别&#xff0c;也就是y的取值只有10种可能&#xff0c;即0到9。 以下参考代码分别考虑了数字字体的大小、数字颜色的深浅…

STM32——从点灯到传感器控制

STM32基础外设开发&#xff1a;从点灯到传感器控制 一、前言 本篇文章总结STM32F10x系列基础外设开发实例&#xff0c;涵盖GPIO控制、按键检测、传感器应用等。所有代码基于标准库开发&#xff0c;适合STM32初学者参考。 二、硬件准备 STM32F10x系列开发板LED模块有源蜂鸣器…

java day14

接昨天&#xff0c;响应 响应 就是我们在处理请求的时候&#xff0c;里面的return 其实方法里面写的return的返回平常的什么字符串啊什么等等&#xff1b;这些东西都是直接返回&#xff1b;如果是一个对象的话&#xff0c;我们会按json的格式返回&#xff1b; 这些都依赖于一…

Tailwind css实战,基于Kooboo构建AI对话框页面(一)

在当今数字化时代&#xff0c;AI 助手已成为网站和应用不可或缺的一部分。本文将带你一步步使用 Tailwind CSS 和 Kooboo 构建一个现代化的 AI 对话界面框。 一、选择 Kooboo平台 的核心优势 智能提示&#xff1a;在输入 class 属性时&#xff0c;会自动触发 Tailwind CSS 规则…

重塑数学边界:人工智能如何引领数学研究的新纪元

目录 一、人工智能如何重新定义数学研究的边界 &#xff08;一&#xff09;数学与AI的关系&#xff1a;从基础理论到创新思维的回馈 &#xff08;二&#xff09;AI的创造力&#xff1a;突破传统推理的局限 &#xff08;三&#xff09;AI对数学研究的潜在贡献&#xff1a;创…

docker部署并测试翻译模型-CSANMT连续语义增强机器翻译

1.模型选择CSANMT-Translation模型&#xff1a; 2.修改docker-compose.yml文件&#xff0c;重新定义模型缓存路径和存储路径 其中MODELSCOPE_CACHE指定了模型的下载路径。 3.运行docker compose up -d --build&#xff0c;提示出现报错&#xff1a;Error response from daemon…

Spring Boot项目配置核心 - pom.xml的依赖管理与构建优化

基础架构 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVe…

告别手抖困扰:全方位健康护理指南

手抖&#xff0c;医学上称为震颤&#xff0c;是常见的身体症状&#xff0c;可能由多种原因引发&#xff0c;了解其成因并采取科学护理措施&#xff0c;对改善症状、维护健康至关重要。 生理性手抖往往因情绪激动、过度劳累、大量饮用咖啡或酒精等引起&#xff0c;这种手抖通常较…

图解深度学习 - 特征工程(DL和ML的核心差异)

前言 深度学习通过自动化特征提取&#xff0c;简化了机器学习工作流程&#xff0c;它让解决问题变得更加简单。因为深度学习将特征工程完全自动化&#xff0c;而特征工程曾经是机器学习工作流程中最关键的一步。 一、机器学习特征工程 机器学习为什么需要特征工程&#xff08…

Datacom-hcia~Datacom-hcie学习笔记索引

hcia VLAN工作原理实验案例(超详细)https://blog.csdn.net/Fanmeang/article/details/145855768?spm1001.2014.3001.5502 交换机工作原理实验案例https://blog.csdn.net/Fanmeang/article/details/145802382?spm1001.2014.3001.5502 ARP理论实验案例&#xff08;超详细&am…

受不了github的网络限制了,我开源了一个图床工具 gitee-spring-boot-starter

嗨嗨嗨~ 我老马又又来了&#xff01;&#xff01;&#xff01;上次写了一篇我开源了一款阿里云OSS的spring-boot-starter&#xff0c;然后买的资源包到期了&#xff0c;后面又想白&#xff08;开&#xff09;嫖&#xff08;源&#xff09;的路子&#xff0c;首先想到了使用gith…

2025年医美行业报告60+份汇总解读 | 附 PDF 下载

原文链接&#xff1a;https://tecdat.cn/?p42122 医美行业在消费升级与技术迭代的双重驱动下&#xff0c;已从边缘市场逐步走向主流。数据显示&#xff0c;2024 年中国医美市场规模突破 3000 亿元&#xff0c;年复合增长率达 15%&#xff0c;但行业仍面临正品率不足、区域发展…

API自动化与持续集成核心实战知识点!

想象一下&#xff0c;你开发的API像一辆跑车&#xff0c;性能强劲&#xff0c;但你如何确保它每次启动都完美无缺&#xff1f;或者你的代码像一道复杂的菜肴&#xff0c;如何保证每次更新都不破坏原有味道&#xff1f;答案就是API自动化测试与持续集成&#xff01;SuperTest让你…

基于SpringBoot+Vue的社区医院信息平台设计与实现

项目背景与概述 随着医疗健康信息化的发展&#xff0c;社区医院的管理逐渐由传统的手工模式转向信息化管理。为了提高医院的管理效率、减少人工操作、提升服务质量&#xff0c;开发一个高效且实用的社区医院信息平台显得尤为重要。本系统基于Spring Boot框架与MySQL数据库设计…

C++ 中的暴力破解算法

一、暴力破解算法原理​ 暴力破解算法&#xff0c;顾名思义&#xff0c;就是通过穷举所有可能的解&#xff0c;逐一验证&#xff0c;直到找到满足条件的解。它不依赖复杂的逻辑推导或数学优化&#xff0c;而是依靠计算机强大的计算能力&#xff0c;将所有可能的情况都尝试一遍…

率先实现混合搜索:使用 Elasticsearch 和 Semantic Kernel

作者&#xff1a;来自 Elastic Enrico Zimuel 及 Florian Bernd 混合搜索功能现在已在 .NET Elasticsearch Semantic Kernel 连接器中提供。阅读这篇博客文章了解如何开始使用。 Elasticsearch 已原生集成业内领先的生成式 AI 工具和服务提供商。欢迎观看我们的网络研讨会&…

基于SpringBoot的网上租赁系统设计与实现

项目简介 本项目是基于 Spring Boot Vue 技术栈开发的 网上租赁系统。该系统通过前后端分离的架构&#xff0c;提供用户和管理员两种角色的操作权限&#xff0c;方便用户进行商品租赁、订单管理、信息查询等操作&#xff0c;同时也为管理员提供了商品管理、用户管理、订单管理…

AI浪潮下,第五消费时代的商业进化密码

解锁 AI 与第五消费时代 在时代的长河中,消费浪潮的更迭深刻地影响着商业的格局。当下,我们正处于第五消费时代,这个时代有着鲜明的特征,如老龄化、单身化趋势日益显著,社会逐渐步入低欲望、个性化与共享化并行的阶段 。随着人工智能技术的飞速发展,它在商业领域的渗透也…

Jouier 普及组十连测 R4

反思 本次比赛到时没有什么细节错误&#xff0c;不过代码思路不好所以分数也不是很高。 T1 代码思路 看题意&#xff0c;发现数据范围不大&#xff0c;直接动用码力暴力即可。 代码 #include<bits/stdc.h> using namespace std;vector<vector<int> > a(110…