首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot Redis:对来自后端服务的对象进行分布式缓存,以实现对同一对象的并行消费者请求

Spring Boot Redis:对来自后端服务的对象进行分布式缓存,以实现对同一对象的并行消费者请求
EN

Stack Overflow用户
提问于 2020-02-06 03:13:03
回答 1查看 867关注 0票数 2

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

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

例如,后端的结构如下:

代码语言:javascript
复制
public class Customer
{
   private String id;
   private String bankAccount;
   private String customerName;
}

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

代码语言:javascript
复制
public class ServiceController
{
   getBankAccountById(String id);
   getCustomerNameById(String id);
   getCustomerObjectById(String id);
}

所有请求都会为customer对象生成一个后端调用,如果还没有对象,则将其缓存到redis中。

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

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

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

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

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

提前谢谢,干杯,亚历克斯

//编辑:我的意思是@Cachable(sync=true)只影响实例级别,而不是分布式级别。因此,从我的理解来看,这在这里是没有意义的。

EN

回答 1

Stack Overflow用户

发布于 2020-02-06 14:14:58

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60082642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档