Quarkus中Redis缓存使用UUID作为Key的适配问题
Quarkus Redis缓存中UUID作为Key的异常问题
问题场景
在Quarkus框架中使用Redis缓存时,遇到java.util.UUID作为Key无法正常获取缓存值的问题:
异常代码实现(UUID作为Key)
private final ValueCommands<UUID, String> commands; public Cache(RedisDataSource ds) { this.commands = ds.value(UUID.class, String.class); } public String get(UUID key) { var value = commands.get(key); }
上述代码的get方法无法找到对应Key的缓存值。
正常工作的代码实现(String作为Key)
将Key改为String类型后,功能恢复正常:
private final ValueCommands<String, String> commands; public Cache(RedisDataSource ds) { this.commands = ds.value(String.class, String.class); } public String get(String key) { var value = commands.get(key); }
测试验证
通过Redis CLI设置缓存:
SET 38e8598b-e700-440c-b92f-b2d078d6fb5f "hello"调用
cache.get时,UUID类型Key无法获取值,String类型Key可以正常获取。应用内部设置UUID Key的情况:
@GET @Produces(MediaType.APPLICATION_XML) public String getFromRedis() { cache.set( UUID.fromString("32e8598b-e700-440c-b92f-b2d078d6fb5f"), "hello-world" ); return cache.get(UUID.fromString("32e8598b-e700-440c-b92f-b2d078d6fb5f")); }应用自身设置的UUID Key可以正常获取,但Redis CLI设置同值Key后仍无法匹配。进一步排查发现:
- Quarkus生成的UUID对应的Redis Key为
"\"12e8598b-e700-440c-b92f-b2d078d6fb5f\""(带双引号) - CLI设置的Key为
"12e8598b-e700-440c-b92f-b2d078d6fb5f"(无引号)
- Quarkus生成的UUID对应的Redis Key为
疑问
UUID作为Redis缓存Key是否不受支持?是否应始终优先使用String类型的键值对?
原因分析
UUID作为Redis Key是受支持的,问题出在Quarkus Redis客户端的默认序列化逻辑:
- Quarkus默认会将UUID对象序列化为带双引号的字符串,而Redis CLI直接设置的是无引号的纯UUID字符串。
- 两种方式生成的Key字符串完全不同,因此无法匹配到对应的值。
解决方案与建议
统一Key的序列化规则
如果要继续使用UUID作为Key,可以自定义Redis序列化器,让UUID序列化为不带引号的纯字符串格式,确保和CLI或其他客户端设置的Key格式一致。优先使用String类型Key
从兼容性和易用性角度,建议优先将UUID转换为String类型作为Redis Key:- 使用
uuid.toString()将UUID转为标准字符串,彻底避免序列化差异问题。 - 这种方式兼容性更强,无论是通过CLI、其他应用还是Quarkus本身设置的Key,都能保持格式一致,减少跨客户端的适配成本。
- 使用
避免混合不同类型的Key设置方式
如果必须在应用外(如CLI)设置Key,要保证Key的格式和应用内序列化后的格式完全一致,否则会出现匹配失败的情况。
内容的提问来源于stack exchange,提问作者santi254
相关产品推荐
相关产品推荐

