使用 Spring Data Redis 实现 Redis 数据存储详解

Spring Data Redis详解(超详细版) Spring Data Redis是一个功能强大且易于使用的Redis客户端库。它封装了Redis的底层操作,为开发者提供了更加简洁、易用的API,使得在Spring应用中集成和使用Redis变得更加方便。通过合理的配置和使用,开发者可以轻松地在Spring应用中实现高效的数据存储和访问。随着Redis的不断发展和完善,Spring Data Redis也将不断更新和升级,以支持更多的Redis特性和功能。 阅读详情
AI摘要

本文详细介绍了使用 Spring Data Redis 实现 Redis 数据存储的方法。包括配置 Spring Data Redis,如引入依赖、配置连接和 RedisTemplate;操作 Redis 多种数据结构;介绍事务支持、发布订阅等高级功能;还提及测试验证及序列化一致性、连接泄漏等注意事项。

使用 Spring Data Redis 实现 Redis 数据存储详解

Spring Data Redis 是 Spring 生态中操作 Redis 的核心模块,它封装了 Redis 客户端的底层细节(如 Jedis 或 Lettuce),提供了统一的 API 来操作 Redis 的数据结构。以下是详细实现步骤:


一、配置 Spring Data Redis

1. 引入依赖

在 pom.xml 中添加依赖(以 Spring Boot 3.x 为例):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 使用 Lettuce 客户端(默认) -->
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
</dependency>
<!-- 可选:连接池(如使用 Jedis) -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
2. 配置 Redis 连接

在 application.yml 中配置 Redis 服务器信息:

spring:
  redis:
    host: localhost      # Redis 服务器地址
    port: 6379          # 默认端口
    password: 123456    # 密码(若无则省略)
    database: 0         # 默认数据库索引
    lettuce:
      pool:
        max-active: 8   # 最大连接数
        max-idle: 4     # 最大空闲连接
        min-idle: 1     # 最小空闲连接
3. 配置 RedisTemplate

自定义 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(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());

        // Value 统一使用 JSON 序列化
        Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        template.setValueSerializer(jsonSerializer);
        template.setHashValueSerializer(jsonSerializer);

        // 特殊数据结构的 Value 序列化(根据需求覆盖)
        // template.setDefaultSerializer(jsonSerializer); // 可选:全局默认序列化

        template.afterPropertiesSet();
        return template;
    }
}

这个Jackson2JsonRedisSerializer配置Value的序列化可能出现LinkHashMap的问题,无法识别对应的实体类,所以建议通过下面这个工具类来获取信息。如下:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.redis.core.RedisTemplate;

public class RedisUtil {

    private final RedisTemplate<String, Object> redisTemplate;
    private final ObjectMapper objectMapper = new ObjectMapper();

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

    /**
     * 读取数据并转换为指定类型
     */
    public <T> T get(String key, Class<T> clazz) {
        Object value = redisTemplate.opsForValue().get(key);
        return objectMapper.convertValue(value, clazz);
    }

    /**
     * 读取集合数据并转换(处理泛型)
     */
    public <T> List<T> getList(String key, Class<T> elementClazz) {
        Object value = redisTemplate.opsForValue().get(key);
        return objectMapper.convertValue(value, new TypeReference<List<T>>() {});
    }
}

二、操作 Redis 数据结构

在这里插入图片描述

1. String(字符串)
  • 用途:存储简单键值对(如缓存、计数器)。
  • 核心方法:opsForValue()
@Autowired
private RedisTemplate<String, Object> redisTemplate;

// 写入值
redisTemplate.opsForValue().set("user:1:name", "Alice");

// 读取值
String name = (String) redisTemplate.opsForValue().get("user:1:name");

// 原子递增
Long count = redisTemplate.opsForValue().increment("article:100:views");
2. Hash(哈希表)
  • 用途:存储对象字段(如用户信息)。
  • 核心方法:opsForHash()
// 存储用户对象
Map<String, String> user = new HashMap<>();
user.put("name", "Bob");
user.put("age", "25");
redisTemplate.opsForHash().putAll("user:2", user);

// 获取单个字段
String age = (String) redisTemplate.opsForHash().get("user:2", "age");

// 更新字段
redisTemplate.opsForHash().put("user:2", "age", "26");

// 获取所有字段
Map<Object, Object> userData = redisTemplate.opsForHash().entries("user:2");
3. List(列表)
  • 用途:实现队列、栈或消息列表。
  • 核心方法:opsForList()
// 左侧插入元素
redisTemplate.opsForList().leftPush("task:queue", "task1");

// 右侧弹出元素(阻塞式)
String task = (String) redisTemplate.opsForList().rightPop("task:queue", 10, TimeUnit.SECONDS);

// 获取列表范围
List<Object> tasks = redisTemplate.opsForList().range("task:queue", 0, -1);
4. Set(集合)
  • 用途:存储唯一值(如标签、共同好友)。
  • 核心方法:opsForSet()
// 添加元素
redisTemplate.opsForSet().add("article:100:tags", "tech", "java", "spring");

// 判断元素是否存在
boolean exists = redisTemplate.opsForSet().isMember("article:100:tags", "java");

// 求交集
Set<Object> commonTags = redisTemplate.opsForSet().intersect("article:100:tags", "article:101:tags");
5. Sorted Set(有序集合)
  • 用途:排行榜、优先级队列。
  • 核心方法:opsForZSet()
// 添加元素及分数
redisTemplate.opsForZSet().add("leaderboard", "player1", 100.0);
redisTemplate.opsForZSet().add("leaderboard", "player2", 85.5);

// 获取前 10 名
Set<ZSetOperations.TypedTuple<Object>> topPlayers = 
    redisTemplate.opsForZSet().reverseRangeWithScores("leaderboard", 0, 9);

// 更新分数
redisTemplate.opsForZSet().incrementScore("leaderboard", "player1", 20.0);
6. HyperLogLog
  • 用途:近似统计独立用户数(UV)。
  • 核心方法:opsForHyperLogLog()
// 添加元素
redisTemplate.opsForHyperLogLog().add("uv:20231001", "user1", "user2", "user3");

// 统计基数
Long uv = redisTemplate.opsForHyperLogLog().size("uv:20231001");
7. Bitmaps
  • 用途:位操作(如用户签到)。
  • 核心方法:opsForValue().setBit()
// 设置第 5 位为 1(表示用户 ID=5 已签到)
redisTemplate.opsForValue().setBit("sign:user:202310", 5, true);

// 统计总签到数
Long count = redisTemplate.execute(
    (RedisCallback<Long>) conn -> conn.bitCount("sign:user:202310".getBytes())
);
8. GEO(地理空间)
  • 用途:附近位置查询。
  • 核心方法:opsForGeo()
// 添加地理位置
redisTemplate.opsForGeo().add("cities", 
    new Point(116.405285, 39.904989), "Beijing");

// 查询距离
Distance distance = redisTemplate.opsForGeo()
    .distance("cities", "Beijing", "Shanghai", Metrics.KILOMETERS);

// 附近 100km 内的城市
GeoResults<GeoLocation<Object>> results = redisTemplate.opsForGeo()
    .radius("cities", "Beijing", new Distance(100, Metrics.KILOMETERS));

三、高级功能

1. 事务支持
redisTemplate.execute(new SessionCallback<List<Object>>() {
    @Override
    public List<Object> execute(RedisOperations operations) {
        operations.multi();  // 开启事务
        operations.opsForValue().set("key1", "value1");
        operations.opsForHash().put("hash1", "field", "value");
        return operations.exec();  // 提交事务
    }
});
2. 发布订阅
// 发布消息
redisTemplate.convertAndSend("news", "Breaking news: Spring 6 released!");

// 订阅消息(需定义 MessageListener)
@Bean
public MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
    return new MessageListenerAdapter(receiver, "receiveMessage");
}

@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory factory,
                                              MessageListenerAdapter listener) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(factory);
    container.addMessageListener(listener, new ChannelTopic("news"));
    return container;
}
3. 管道操作(批量执行)
List<Object> results = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
    connection.stringCommands().set("key1".getBytes(), "value1".getBytes());
    connection.stringCommands().set("key2".getBytes(), "value2".getBytes());
    return null;
});

四、测试与验证

1. 注入 RedisTemplate
@SpringBootTest
public class RedisTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    void testString() {
        redisTemplate.opsForValue().set("testKey", "Hello Redis");
        assertEquals("Hello Redis", redisTemplate.opsForValue().get("testKey"));
    }
}
2. 检查 Redis 连接
@Autowired
private RedisConnectionFactory redisConnectionFactory;

@Test
void testConnection() {
    RedisConnection conn = redisConnectionFactory.getConnection();
    assertTrue(conn.ping().equals("PONG"));
    conn.close();
}

五、注意事项

  1. 序列化一致性
    确保所有操作的 Key/Value 序列化方式一致,避免出现乱码或类型错误。

  2. 连接泄漏
    使用 @Transactional 或手动关闭连接,避免未释放的连接耗尽资源。

  3. 数据淘汰策略
    在 Redis 配置中设置 maxmemory-policy(如 allkeys-lru),防止内存溢出。

  4. 集群模式
    若使用 Redis 集群,需在配置中指定所有节点地址:

    spring:
      redis:
        cluster:
          nodes: host1:6379,host2:6379,host3:6379
    

【Redis】在Mac上安装使用redis的教程 阅读详情

相关推荐

Spring Data Redis 使用ZSet(sorted set)和Lua脚本实现模糊查询+分页,并返回模糊查询后结果集的总数

Spring Data Redis 中的 ZSet(有序集合)和 Lua 脚本来实现模糊查询和分页功能,并返回查询结果以及结果的总数

weixin_58936212的博客 1566

Spring Data Redis

Spring Data Redis的使用,什么时候用redis

m0_71560190的博客 6364

深入学习 Redis - 基于 Spring Data Redis 操作 Redis

RedisTemplate 是把 Redis 的方法,分成了几个类别来进行组织,和原生的 Redis 命令有一定的差异~ 作者的初心是希望通过上述封装,让接口看起来更简单,但在我看来,并没有达成,反而因为与 Redis 原生命令差异,提高了使用者的学习成本.之前使用 Jedis 是通过 Jedis 对象里的各种方法来操作 redis 的,此处 Spring 则是通过 SpringRedisTemplate 来操作 redis.

CYK_byte的博客 2547

SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址提供了对不同Redis客户端的整合(Lettuce和Jedis)提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化。

weixin_43811057的博客 4487

Vivado DDR IP自定义型号避坑指南:如何正确填写CSV参数表(附常见错误排查)

本文详细解析了Vivado DDR IP自定义型号配置中的关键步骤与常见问题,特别针对DDR4内存颗粒的参数提取、CSV参数表填写误区及故障排查提供了实用指南。通过实际案例和调试技巧,帮助工程师避免配置陷阱,提升DDR4系统稳定性和性能。

weixin_29280657的博客 413

企业信息化系统的组成模块-核心业务系统

通过标准化的数据流形成完整的业务闭环,CRM生成的销售订单驱动ERP的生产和采购,ERP将生产计划传递给MES执行,MES报工数据返回ERP进行成本核算,ERP再将交付信息同步给CRM供客户查询。生产管理确保高效交付,缩短订单周期。某贸易公司实施ERP供应链模块后,库存周转率从每年4次提升到8次,库存资金占用从2000万降到1200万,释放800万现金流,同时缺货率从15%降到5%。│ │库存 │ │ MRP │ │ ERP │ │ 云ERP/ │ │。

weiyvyy的博客 694

Spring Session Redis最佳实践(2)认识Redis中的数据存储

欢迎转至站内查看原文,链接为:https://www.chendd.cn/information/viewInformation/experienceShare/310.a 前一文我通过一些示例实践实现了一个较为简单的Spring Session Redis的数据管理,本篇主要说一下Session数据存储在Redis中的数据结构及使用Jedis进行一些小小的Junit测试一下,将存储至Redis...

haiyangyiba的专栏 2300

TSMC40nmLP版图实战:从Design Rule解读到Cadence高效布局布线

本文详细解析了TSMC40nmLP工艺的版图设计实战,从Design Rule解读到Cadence高效布局布线技巧。重点介绍了40nm工艺中的关键设计规则,如最小线宽、间距规则和深N阱规则,并分享了Cadence Virtuoso中的高效工作流和射频模块设计技巧,帮助工程师提升版图设计效率和质量。

weixin_29250403的博客 378

【Redis】掌握Java中的Redis魔法:Jedis与Spring Data Redis(实战指南)

本文通过详细的步骤和实战案例,引导Java开发者掌握Redis在现代应用中的高效使用方法。从Redis的基础概念到Jedis与Spring Data Redis的高级特性,本文不仅涵盖了安装配置、数据类型操作,还包括了连接池管理、集群支持及持久化策略等内容。通过实战案例,读者将学会如何设计缓存策略、处理常见错误并确保系统的高可用性。无论你是Redis新手还是希望深化理解的进阶用户,都能从中受益。

欢迎来到我的技术空间!我是一名经验丰富的Java开发工程师,热衷于分享我在软件开发领域的知识和心得。在这个博客里,您会发现一系列关于Java编程的文章,包括最佳实践、技术趋势、代码优化技巧以及一些有趣的项目案例。无论是初学者还是有经验的开发者,都能在这里找 1388

铭飞MCMS源码部署

文章目录前言一、下载铭飞源码二、部署源码1.使用IDEA打开源码2.配置tomcat环境2.1下载tomcat并测试是否可以成功启动(此处不赘述)2.2在IDEA中安装tomcat环境并配置3.添加数据库,并配置3.1新建数据库3.2 导入sql配置三、启动测试 前言 铭飞MCMS基于IDEA、tomcat和mysql的环境搭建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载铭飞源码 gitee:https://gitee.com/mingSoft/MCMS/releases(各种版本按需下

MARS_ZORO的博客 4062

EGO-Planner文章解读(一)——论文原理和算法实现

详细解读egoplanner论文和代码

fegxg的博客 3984

探索Spring Data Key Value的无限可能 —— 实战示例项目全面解读

探索Spring Data Key Value的无限可能 —— 实战示例项目全面解读 项目介绍 随着数据存储技术的多元化,非关系型数据库、MapReduce框架和云端数据服务逐渐成为现代应用开发的主流。在这一背景下,VMware曾经维护的spring-data-keyvalue-examples项目,虽然官方不再活跃维护,但其作为Spring Data家族的重要成员,依然值得我们深入探讨。该项目专...

gitblog_01081的博客 541

【AI+教育】别再让 Cursor 只当编辑器了!4 步解锁 Claude 官方技能!

本文介绍了在Windows环境下通过OpenSkills工具在Cursor中调用Claude AI技能的方法。主要内容包括:1)安装Node.js环境;2)全局安装OpenSkills工具;3)安装Claude官方技能库;4)通过AGENTS.md文件同步技能;5)在Cursor中直接调用技能完成Excel、PPT等任务。文章提供了详细的操作步骤和示例,帮助用户快速上手使用AI技能提升工作效率。

奶爸的编程之路,也就一周冷个三天 751

spring-boot-starter-data-redis初始化(使用lettuce)

前言 1、查了许多资料,整合成一个通用的RedisTemplate。 2、推荐Redis可视化工具 Another Redis DeskTop Manager,免费好用,人机交互性能好。 配置 当前版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>

干饭人的食堂 1万+

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

15、SQL Server查询优化与CPU负载管理

本文深入探讨了SQL Server查询优化与CPU负载管理的关键技术,包括强制连接类型的使用、键查找问题的解决、索引设计的最佳实践、高CPU负载的排查与优化,以及并行性的利弊与调整策略。通过优化查询逻辑、合理设计索引、监控与管理CPU资源,可以显著提升SQL Server的性能和稳定性。适用于数据库开发人员和DBA进行性能调优参考。

pz8901234的博客 76

Spring Boot对Redis的支持

一 点睛 Redis是一个基于健值对的开源内存数据存储,当然Redis也可以做数据缓存。 二 Spring对Redis的支持 1 配置 Spring对Redis的支持是通过Spring Data Redis来实现的,Spring Data JPA为我们提供了连接相关的ConnectionFactory和数据操作相关的RedisTemplate。 根据Redis的不同的Java客户端,Sp...

实践求真知 867

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring Data Neo4j 提供了一种简便的方法来集成 Neo4j 图形数据库到基于 Spring 的应用程序中

确保领域对象之间关联方式恰当合理,避免过度复杂化造成不必要的遍历开销。同时也要注意调整好分页参数大小,在获取大量结果集的情况下采取增量加载策略减少一次性读取量级带来的压力。接着定义一个继承自这允许开发者无需编写具体实现即可获得常用的数据持久化方法。

[Blog][Domain] programb.blog.youkuaiyun.com 596

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SpringBoot中Spring-data-redis入门使用

SpringBoot中Spring-data-redis入门使用 编者的话 Spring-data-redis是基于Spring框架的redis链接插件,功能强大,简单好用(至少对我这种小白,不深究其原理和强大功能的话,是简单好用的),其和Jedis两者是Spring中常用的操作Redis服务的工具,两者的区别及其优缺点自行百度,我也不会,推荐大佬的博文 JAVA与Redis的结合 这里,小编只是介绍Spring-data-redis的简单使用,其包括引依赖,application.yml中对进行简单配置,

weixin_42510217的博客 3311

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring Data是什么

Spring Data 是一个强大的框架,旨在简化与各种数据存储的交互,提升开发效率。通过使用 Spring Data,开发者能够专注于业务逻辑,而无需过多关注底层数据访问的复杂性。

weixin_44594317的博客 799

在Spring Boot中使用Redis

Redis是一种缓存数据库,能大副降低代码对数据库的操作。简单来说,可以将一些查询结果放在Resdis当中,当发送请求时,先从Redis中查询,如果没有再从数据库中查询,以降低数据库的压力,同时也提升了查询的效率。...

清沙 443

【 Redis | 基础篇 详解 】

redis从入门到实战基础篇

2025优快云博客之星Top246,后端开发技术领域新星创作者。 3249

redis的基本使用

一、 Redis简介一、 Redis简介NoSQL数据库Redis在windows下的安装下载的安装包有两种形式,一种是一键安装的msi文件,还有一种是解压缩就能使用的zip文件,哪种形式都行。Redis的Windows版属于绿色软件,,解压后目录结构如下:二、redis的使用二、1、服务器启动命令通过快捷键Ctrl + C 即可停止Redis服务二、2、客户端连接命令客户端连接命令:redis-cli.exe。

学习笔记 3万+

(三)Spring Data

Spring Data 是一个极大简化数据库操作的框架,它提供了与各种数据存储技术的无缝集成,减少了开发者手动编写的 SQL 或查询代码。通过自动化数据访问、灵活的查询机制和简化的配置,Spring Data 提供了一个高效、可靠的数据库交互方案。

qq_50847694的博客 731

spring 集成 redis spring-data-redis

spring-data-redis封装了redis的操作,很方便的在项目中使用redis 整合spring-data-redis非常简单,一共需要修改3个文件。1.pom.xml 2.application-context.xml 3.redis.properties 1.在pom中添加spring-data-redis和redis的依赖 &lt;dependency&g...

jaffreyen的博客 566
上一篇: Redis数据结构介绍
下一篇: RedisTemplate的序列化配置方式详解
小李不秃头♛
博客等级 码龄2年 619粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值