当前位置: 首页 > news >正文

Spring Boot 操作 Redis 时 KeySerializer 和 HashKeySerializer 有什么区别?

在使用 Spring Data Redis 时,我们通常会设置 RedisTemplate 的序列化方式。其中,两个很容易混淆的配置是:

  • KeySerializer
  • HashKeySerializer

这两个序列化器看起来名字相似,但作用却完全不同。本文将从实际使用场景出发,带你彻底搞清楚这两个参数的含义与使用方式。


📌 一句话概括区别

名称应用场景用途说明
KeySerializer普通 K/V 结构的 key,如 set("k", "v")序列化最外层 Redis 键(key)
HashKeySerializerRedis Hash 结构中的字段名,如 hset("hash", "field", "value")序列化 Hash 内部的字段名(field)

✅ 示例解释

下面我们用两个典型的 Redis 数据结构来展示它们分别在什么场景下生效。

1. 普通 Key-Value 操作

redisTemplate.opsForValue().set("user:1", "zhangsan");

在这个操作中:

元素对应序列化器
"user:1"KeySerializer
"zhangsan"ValueSerializer

2. Hash 类型操作

redisTemplate.opsForHash().put("user:1", "name", "zhangsan");

在这个操作中:

元素对应序列化器
"user:1"KeySerializer
"name"HashKeySerializer
"zhangsan"HashValueSerializer

❗为什么要特别设置 HashKeySerializer?

如果不手动配置 HashKeySerializer,RedisTemplate 会默认使用 JdkSerializationRedisSerializer【详情可见笔者的另一篇博客Java JDK 默认序列化问题详解与解决方案】,这会导致 Redis 中的字段名变成不可读的二进制乱码

127.0.0.1:6379> hgetall user:1
1) "\xac\xed\x00..."  <-- 乱码
2) "zhangsan"

配置后变为可读字符串:

127.0.0.1:6379> hgetall user:1
1) "name"
2) "zhangsan"

✅ 正确配置方式

推荐配置 RedisTemplate 的四种序列化方式如下:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// key 使用字符串序列化template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());// value 使用 JSON 序列化(可选 Jackson/FastJSON2)template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());template.afterPropertiesSet();return template;}
}

📌 总结对比表

序列化器名称应用位置是否必须设置推荐值
KeySerializerRedis 的最外层 key,如 "user:1"✅ 是StringRedisSerializer
ValueSerializer普通键值结构的 value,如 "zhangsan"✅ 是JSON 序列化器
HashKeySerializerHash 内字段名(field),如 "name"✅ 是StringRedisSerializer
HashValueSerializerHash 内字段值,如 "zhangsan"✅ 是JSON 序列化器

✅ 使用建议

  • 四个序列化器都要手动配置,不要依赖默认值
  • 建议统一使用 StringRedisSerializer + GenericJackson2JsonRedisSerializer,可读性强、兼容性好

✍写在最后

Redis 是一个轻量、高性能、跨语言的缓存中间件。在 Java 项目中合理配置 RedisTemplate 的序列化方式,不仅能提升可读性和调试体验,也能避免数据不兼容和乱码问题。希望本文能帮助你从源头上理解 KeySerializerHashKeySerializer 的本质区别。

http://www.lryc.cn/news/582252.html

相关文章:

  • 自动驾驶基本结构与组成
  • 【MyBatis】XML实现,配置方法和增、删、改、查
  • 第二届云计算与大数据国际学术会议(ICCBD 2025)
  • 物联网技术的关键技术与区块链发展趋势的深度融合分析
  • React Native 基础组件详解<一>
  • VSCODE创建JS项目
  • 常见问题与最佳实践——AI教你学Docker
  • 【力扣(LeetCode)】数据挖掘面试题0002:当面对实时数据流时您如何设计和实现机器学习模型?
  • EPLAN 电气制图:项目的创建(多功能天车系统案例)
  • 摄影后期:使用Photoshop进行暗角控制
  • 分布式生成 ID 策略的演进和最佳实践,含springBoot 实现(Java版本)
  • 【R语言】Can‘t subset elements that don‘t exist.
  • LastActivityView -查看电脑上的所有操作记录
  • 初识Neo4j之入门介绍(一)
  • 【Linux系统】Linux权限 | Shell命令以及运行原理
  • Python爬虫图片验证码和滑块验证码识别总结
  • Taro+Vue3实现微信小程序富文本编辑器组件开发指南
  • OpenCV人脸分析------绘制面部关键点函数drawFacemarks()
  • 虚幻引擎UE5 GAS开发RPG游戏-02 设置英雄角色-18 改成网络多人游戏
  • turborepo 如何解决git管理包过大的问题
  • 5、Receiving Messages:Message Listener Containers
  • Python实现文件夹中文件名与Excel中存在的文件名进行对比,并进行删除操作
  • 【无标题】三维拓扑量子色动力学模型:理论重构与实验验证
  • day16——Java集合进阶(Collection、List、Set)
  • windows安装python环境以及对应编辑器的详细流程
  • 从依赖地狱到依赖天堂PNPM
  • VmWare 安装 mac 虚拟机
  • 大模型在肾囊肿诊疗全流程预测及应用研究报告
  • 【保姆级喂饭教程】Git图形化客户端Sourcetree安装及使用教程
  • Linux系统从入门到精通!第四天(shell编程和Docker)