讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

在Spring Boot中怎样优雅地对Redis中Hash类型数据进行批量增删?

秋磊小哥_4418

秋磊小哥_4418

发布时间:2026-11-15 06:53:20

|

857人浏览过

|

来源于php中文网

原创

redisTemplate.opsForHash().putAll()非原子操作且不减少网络往返,实际限制在于序列化配置需统一、Map键必须为String、高并发下易覆盖竞态;批量删field须用HashOperations.delete()而非delete(Collection),pattern删除应优先用Lua脚本。

在spring boot中怎样优雅地对redis中hash类型数据进行批量增删?

redisTemplate.opsForHash().putAll() 批量写入 Hash 的实际限制

直接调用 putAll() 看似能一次塞入多个 field-value,但它底层仍是逐个执行 HSET 命令,不是原子操作,也不减少网络往返。更关键的是:如果目标 Hash key 本身不存在,putAll() 会创建它;但如果已存在且部分 field 要覆盖、部分要新增,行为完全正常——这点常被误认为“不生效”。

真正容易出问题的是序列化配置:如果你的 RedisTemplate 没统一设置 hashKeySerializer 和 hashValueSerializer,比如 key 用 StringRedisSerializer 而 value 用了 GenericJackson2JsonRedisSerializer,那么 putAll(Map<string object>)</string> 中的 Object 值可能因反序列化失败导致写入空或乱码。

  • 务必检查 redisTemplate.setHashKeySerializer(...) 和 redisTemplate.setHashValueSerializer(...) 是否显式设置
  • putAll() 接收的 Map 键必须是 String 类型(否则抛 ClassCastException)
  • 不建议在高并发场景下对同一 Hash key 频繁调用 putAll(),易引发字段覆盖竞态

批量删除 Hash 中多个 field 必须用 delete(Object key, Object... hashKeys)

别用 delete(Collection> keys) ——那是删 Redis 的 top-level keys,和 Hash 内部字段完全无关。正确入口是 HashOperations.delete(),它接受可变参数列表,一次删多个 field:

redisTemplate.opsForHash().delete("cart:1001", "item_123", "item_456", "item_789");

这个调用最终发的是单条 HDEL cart:1001 item_123 item_456 item_789,网络开销低、原子性强。但注意两点:

  • 传入的 field 参数类型必须和存入时一致;若当初用 Long 存的 field 名,这里也得传 Long,混用 String 会导致删不掉
  • 即使某个 field 不存在,也不会报错,整条命令仍成功返回实际删除数量(Long 类型)
  • 不能传 null 字段名,否则抛 IllegalArgumentException

想按 pattern 批量删 Hash 字段?Redis 本身不支持,得自己 scan + hdel

Redis 的 Hash 结构没有类似 KEYS 或 SCAN 的字段级模糊匹配指令。如果你需要删 “所有以 temp_ 开头的 field”,只能先读全量再过滤:

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
Map<Object, Object> allFields = redisTemplate.opsForHash().entries("cart:1001");
List<Object> toDelete = allFields.keySet().stream()
    .filter(k -> k instanceof String && ((String) k).startsWith("temp_"))
    .collect(Collectors.toList());
redisTemplate.opsForHash().delete("cart:1001", toDelete.toArray());

这看似三步,但隐患明显:

  • 如果 Hash 有上万字段,entries() 会把全部数据拉到 JVM 内存,可能 OOM
  • 两次网络往返(一次 HGETALL,一次 HDEL),中间若有其他客户端写入,可能删错
  • 更稳妥的做法是改用 Lua 脚本,在服务端完成匹配与删除,避免数据搬移

Hash 整体删除比删字段更常用,但要注意 key 类型误判

最省事的“批量删”其实是直接删整个 Hash key:redisTemplate.delete("cart:1001")。它等价于 Redis 的 DEL 命令,无论内部有多少字段,都一并清除。但常见错误是:误以为 delete() 只删 Hash 字段,结果把不该删的 String / List 类型 key 也干掉了。

所以,执行前务必确认 key 类型:

  • 用 redisTemplate.type("cart:1001") 返回 DataType.HASH 再删,避免误删
  • 生产环境建议加日志:log.debug("Deleting HASH key: {}", key),尤其涉及用户数据时
  • 如果 key 是通过拼接生成(如 "cart:" + userId),确保 userId 已校验非空、合法,防止删成 "cart:null"

Hash 的批量操作表面简单,但序列化、类型一致性、网络往返和原子性边界这几个点,稍不注意就会在压测或上线后暴露。尤其是字段级 pattern 删除,别图省事用 entries(),该上 Lua 就上 Lua。

热门AI工具

更多
SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

相关专题

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

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

2991

2025.08.06

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

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

517

2026.01.26

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

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

4969

2023.11.02

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

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

4555

2023.11.14

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

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

8872

2024.04.02

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

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

683

2024.04.07

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

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

776

2024.04.07

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

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

9262

2024.04.07

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero官方文档
Go-Zero官方文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn