Spring Boot项目中使用Redis存取List数据的最佳实践是什么?

轻涛姑娘_5003

轻涛姑娘_5003

2026-08-22

263人浏览

原创

用 redistemplate + listoperations 是最稳妥方案,但必须显式配置 genericjackson2jsonredisserializer 序列化器,否则因默认 jdk 序列化导致取值为 null 或乱码;key 用 stringredisserializer,value 用 genericjackson2jsonredisserializer,并注意 localdatetime 等类型需注册 javatimemodule。

spring boot项目中使用redis存取list数据的最佳实践是什么?

直接结论:用 RedisTemplate + ListOperations 是最稳妥的方案,但必须显式配置序列化器,否则取出来的 List 会是乱码或 null。

为什么默认的 RedisTemplate<string object></string> 取不到 List 数据?

Spring Boot 的 RedisTemplate 默认使用 JDK 序列化(JdkSerializationRedisSerializer),它把整个 List 对象当做一个整体序列化成二进制字节。你存进去的是 [{"id":"1","name":"a"},{"id":"2","name":"b"}],Redis 里实际存的是类似 aced00057372...(一长串十六进制) 的内容。

这时候如果用 range(key, 0, -1),Redis 返回的是一个个被序列化的 Object 元素,但反序列化失败——因为每个元素不是独立 JSON 字符串,而是嵌套在 List 容器里的完整对象字节流。

常见错误现象:
- range() 返回空 List 或 null
- 控制台打印出类似 java.util.ArrayList@3a5e7876 的 toString 结果
- Redis CLI 中用 LRANGE myKey 0 -1 看到一堆不可读字符

怎么正确配置 RedisTemplate 支持 List 存取?

核心是让 key 和 value 都走 JSON 序列化,且确保每个 list 元素单独序列化(而不是整个 list 一起序列化)。推荐用 GenericJackson2JsonRedisSerializer:

  • 不要用 StringRedisTemplate —— 它只支持 String 类型,没法直接存 List<user></user>
  • 不要用 RedisTemplate<string string></string> 存对象 —— 会报 ClassCastException,因为反序列化时类型不匹配
  • 必须指定 value 序列化器为 GenericJackson2JsonRedisSerializer,并传入具体泛型类型(如 User.class)或留空让它自动推断
  • key 序列化器建议用 StringRedisSerializer,避免 key 也变成乱码

示例配置:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
@Bean
public RedisTemplate<string object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<string object> template = new RedisTemplate();
    template.setConnectionFactory(connectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
}</string></string>

leftPushAll 和 rightPushAll 的实际效果差异

这两个方法本质都是批量 push,区别仅在于插入顺序和语义:

  • leftPushAll(key, list):把 list 中每个元素依次调用 LPUSH,结果是 list[0] 成为 Redis list 的 头元素(最左),list[n] 成为尾元素
  • rightPushAll(key, list):对应 RPUSH,list[0] 成为 尾元素(最右),list[n] 成为头元素
  • 性能上无明显差别,但如果你依赖「先进先出」或「后进先出」语义,选错会导致业务逻辑翻转

比如缓存用户最近操作日志,想按时间正序展示(最早 → 最新),就该用 rightPush 单个追加;若用 rightPushAll 批量写入一个已排序的 List<log></log>,顺序会被反转。

取值时 range(key, 0, -1) 的边界陷阱

range 是安全的,但容易忽略两个细节:

  • start 和 end 是 索引位置,不是元素个数。例如 range(key, 0, 9) 取前 10 个,range(key, 0, -1) 取全部
  • 如果 key 不存在,range 返回空 List(不是 null),但如果你没判空直接调用 .size() 没问题;可一旦中间有元素是 null(比如序列化失败导致某次 push 写入了 null 字节),range 仍返回包含 null 元素的 List,后续遍历时可能触发 NullPointerException
  • 大 List 场景下慎用 range(key, 0, -1):Redis 会把整个 list 加载进内存再切片,可能引发 OOM。应优先用分页方式(如 range(key, offset, offset+limit-1))或改用 lrange 命令配合游标

真正容易被忽略的是:当你用 GenericJackson2JsonRedisSerializer 存 List<user></user>,但某个 User 字段含 Java 8 时间类型(如 LocalDateTime),而 Jackson 没配 JavaTimeModule,反序列化时会静默失败,对应位置返回 null —— 这种问题不会报错,只会让你在业务层莫名其妙拿到空对象。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

spring boot redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2251

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

437

25

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4209

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3695

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6632

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6162

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1140

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring Boot 官方快速入门指南
Spring Boot 官方快速入门指南

共0课时 | 0人学习

Spring Boot 官方参考文档
Spring Boot 官方参考文档

共0课时 | 0人学习

尚硅谷新版SpringBoot3教程
尚硅谷新版SpringBoot3教程

共0课时 | 0人学习