gpt4 book ai didi

java - Spring 启动Redis : Distributed Caching of Objects from Backend Services for parallel consumer requests for the same Object

转载 作者:太空宇宙 更新时间:2023-11-04 09:07:09 24 4
gpt4 key购买 nike

我不知道如何在标题中更好地解释我的挑战。

当前的设置是,我使用 Spring Rest Service 作为“中间件层”,以便以更“友好”的方式转换后端数据,这是一个巨大的响应。

这是后端的结构示例:

public class Customer
{
private String id;
private String bankAccount;
private String customerName;
}

中间件当前正在redis中缓存来自后端的响应。它还具有以下端点:

public class ServiceController
{
getBankAccountById(String id);
getCustomerNameById(String id);
getCustomerObjectById(String id);
}

所有请求都会生成对客户对象的后端调用,并将其缓存在 Redis 中(如果尚不存在对象)。

但是在多线程环境中,尤其是在“云”/多实例环境中,如果消费者正在执行 n 个请求(#1 getBankAccountById() #2 getCustomerNameById() 等,以并行方式 - 完全相同的毫秒),那么只有一个请求会针对“真实”后端触发?

我的目标是在redis中放入一个标记,表明在不久的将来,缓存中将会有一个给定id的customer类型的对象,这会导致阻塞所有其他线程/其他实例的线程,以减少后端调用。

我的问题是,是否有一个简单的或开箱即用的解决方案?

我发现的唯一的东西是 Spring Boot 和 @Cacheable 的文档,这是不可行的,因为它在同一应用程序中同步对给定 Id 的调用,而不是在集群环境中的服务范围。

除此之外,后端非常慢(每次调用 5-10 秒),@Cacheable 注释已经通过,因为当返回实际的 @Cachable 对象时它开始写入缓存。

提前致谢,干杯亚历克斯

//编辑:我的意思是 @Cachable(sync=true) 仅影响实例级别,而不影响分布式级别。因此,根据我的理解,这实际上没有意义。

最佳答案

您可以尝试使用@Cacheable(sync = true),这确保只有单线程正在构建缓存,并且所有其他线程都可以访问缓存而不是进行后端调用。

关于java - Spring 启动Redis : Distributed Caching of Objects from Backend Services for parallel consumer requests for the same Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60082642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com