当前位置: 首页 > 知识库问答 >
问题:

从不同的微服务读取相同的缓存

上官鸿祯
2023-03-14

我使用spring-data-redis(2.1.5.release)和jedis(2.10.2)客户端从作为spring-boot应用程序运行的不同服务连接到我的azure redis实例。

两个服务具有相同的缓存方法,并通过实现以下配置指向相同的缓存。am面临的问题是,当一个服务试图读取另一个服务创建的缓存值时,出现了去序列化异常。

例外情况:

注意:我使用redis只是为了缓存从我的数据库中读取的数据。

public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
    return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}

@Bean
public RedisCacheManager cacheManager() {
    Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
    cacheNamesConfigurationMap.put("employers", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
    cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));

    RedisCacheManager manager = new RedisCacheManager(redisCacheWriter(), RedisCacheConfiguration.defaultCacheConfig(), cacheNamesConfigurationMap);
    manager.setTransactionAware(true);
    manager.afterPropertiesSet();

    return manager;
}
public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
    return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}

@Bean
public RedisCacheManager cacheManager() {
    Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
    cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));

    RedisCacheManager manager = new RedisCacheManager(redisCacheWriter(), RedisCacheConfiguration.defaultCacheConfig(), cacheNamesConfigurationMap);
    manager.setTransactionAware(true);
    manager.afterPropertiesSet();

    return manager;
}

@cacheable(value=“employees”,key=“#employeesId”)public Employee getEmployee(String employeesId){//methods}

公共类Employee实现Serializable{private String ID;private String Name;}

共有1个答案

施俊哲
2023-03-14

我建议您确保Employee类是相同的,然后向类添加一个serialVersionUID字段。清除Redis缓存,然后重试。

这来自java.io.Serializable接口中的Javadocs:

如果可序列化的类没有显式声明serialVersionUID,那么序列化运行库将根据类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。但是,强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类的详细信息高度敏感,这些详细信息可能因编译器实现而异,因此可能在反序列化过程中导致意外的InvalidClassException。因此,要保证跨不同java编译器实现的serialVersionUID值一致,可serializable类必须声明一个显式的serialVersionUID值。还强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为这样的声明只应用于立即声明的类--serialVersionUID字段作为继承的成员并不有用。

 类似资料:
  • 我决定第一次尝试实现微服务架构,而不是单一架构,并遇到了授权问题。在一个整体架构中,当访问挂有[Authorize]属性的控制器时,我只是在头中传递令牌,并对照当前的单个数据库检查它。但是在微服务架构中,每个微服务都有自己的数据库,你如何在访问其他微服务时检查令牌,我听说过API Gateway中的check的实现,但我认为,无论如何,每个微服务都应该有自己的check,因为,如果用户没有被授权,

  • 我有两个不同的方法,在两个不同的类中。我希望他们都能阅读同一行输入,并检查不同的内容。一个查找“给我冲杯咖啡”之类的说明,另一个查找不同的关键字,如“请”和“谢谢”(这些影响程序对我的反应): 然后我在我的主字符串中调用它们,只是为了测试它们: 我的控制台显示如下: 我知道发生了什么,但我想不出其他办法。我也尝试过使用同一个扫描仪,不同的字符串,但仍然不起作用。我怎样才能使这两种方法都能读取我的第

  • 我有这样Apache Cxf maven插件配置: 我基本上有两个问题,也许有人可以回答:

  • 我的问题与这个老问题很相似,但没有令人满意的答案贴在那里。 在DB2中有一个DB表,我试图通过两个或多个单独的Java线程对其进行并行记录读取,前提是这些线程应该读取不同的数据集,即如果线程1读取了前1000条记录,线程2不应该选择这些记录,而是选择不同的1000条记录(如果可用的话)。 由于线程将读取不同的行,因此在读取时不会发生冲突。Connection对象也不会在线程之间共享--它们将使用自

  • 我有个计时器工作 现在,在大多数情况下,这会给我正确的结果。但如果有两个微服务实例同时执行这段代码,会发生什么呢?