java - RedisSerializer 处理 java.util.Optional (Spring Data Redis)

标签 java redis spring-data spring-data-redis

您好,我想使用 Redis 作为缓存提供程序,但不幸的是,redis 序列化程序(Json、String)不支持 java.util.Optional

我认为有些代码行可以更好地解释它:

@Cacheable("test)
public Optional<Account> getAccount(String accountId){
  // ... call to some service or rest api
}

Optional 不能被默认的 java 序列化器序列化,我还没有弄清楚如何告诉 JsonSerializer 处理Optional。这将如何运作?摆脱可选对我来说听起来并不是一个真正的选择。

最佳答案

简而言之:

没有开箱即用的支持。

说明

Spring Cache(属于 spring-context 的一部分)本地存储 @Cacheable 返回的值。方法。当使用像HashMap这样的内存缓存时,这工作得很好。 、Guava 或 EhCache(无复制)。没有进一步的拆箱。 Optional在缓存中可以有不同的语义。 Optional.isPresent() == false可能意味着该值不在缓存中,也可能意味着根本没有可用的值。

但是有两种选择:

  1. 创建一个自己的序列化器(基于 JDK 序列化器),在其中对 Optional<T> 实现特殊处理
  2. 创建您自己的 CacheInterceptor基于CacheAspectSupport但随后您需要调整代理连接,并且很可能您需要禁用默认的 CacheInterceptor

马克·HTH

关于java - RedisSerializer 处理 java.util.Optional (Spring Data Redis),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33650458/

相关文章:

java - sleep 中的线程如何接收事件?

lua - 使用 LIMIT 选项调用 ZRANGEBYSCORE 的 Redis EVAL 语法

spring - 为什么在使用 Spring Boot 时我需要实体可序列化?

bash - 阿拉伯字符的 Redis 语法错误

spring - 使用 Spring Data Redis 进行文本搜索

java - 在事务中转换实体时出现 LazyInitializationException

java - Java 或 C 中字符的位操作?

Java内联类调用父类中的方法

java - 如何在JAVA中通过Mailjet发送附件

python - Django:客户端与流断开连接后清理redis连接