0

https://spring.io/guides/gs/caching-gemfire/上的示例表明,如果缓存未命中,我们必须从服务器获取数据并存储在缓存中。

这是作为 Gemfire 服务器运行的 Gemfire 示例还是 Gemfire 客户端?我认为如果缓存未命中,客户端会自动从服务器获取数据。如果是这种情况,客户端是否会出现缓存未命中?

问候,
亚什

4

1 回答 1

2

首先,我认为您错过了核心Spring Framework 的 Cache Abstraction的要点。我鼓励您在此处阅读有关缓存抽象的预期目的的更多信息。

简而言之,如果您的应用程序对象之一调用某些“外部”、“昂贵”服务来访问资源,那么缓存可能适用,特别是如果传递的输入每次都会产生完全相同的输出。

因此,暂时假设您的应用程序调用Google Maps API中的Geocoding API来转换地址和(反)纬度/经度坐标。

您可能有一个@Service像这样的应用程序 Spring 组件......

@Service("AddressService")
class MyApplicationAddressService {

  @Autowired
  private GoogleGeocodingApiDao googleGeocodingApiDao;

  @Cacheable("Address")
  public Address getAddressFor(Point location) {
    return googleGeocodingApiDao.convert(location);
  }
}

@Region("Address")
class Address {

  private Point location;

  private State state;

  private String street;
  private String city;
  private String zipCode;

  ...
}

显然,给定纬度/经度(输入),它应该每次都产生相同的地址(结果)。此外,由于对外部 API(如 Google 的地理编码服务)进行(网络)调用可能非常昂贵,既要访问资源又要执行转换,因此这种类型的服务调用非常适合用于在我们的应用程序中进行缓存。

在许多其他缓存提供程序(例如 EhCache、Hazelcaset、Redis 等)中,您当然可以使用 Pivotal GemFire或开源替代方案Apache Geode来支持 Spring 的缓存抽象。

在您的Pivotal GemFire / Apache Geode设置中,您当然可以使用点对点(P2P) 或客户端/服务器拓扑,这并不重要,GemFire/Geode会做正确的事情,一旦“调用之上”。

但是,Spring Cache Abstraction文档指出,当您调用getAddressFor(:Point)支持缓存 (with @Cacheable) 的应用程序组件方法之一(例如 )时,拦截器将首先“咨询”缓存,然后再进行方法调用。如果缓存中存在该值,则返回该值并且不会getAddressFor(:Point)调用“昂贵的”方法调用(例如)。

但是,如果存在缓存未命中,则Spring将继续调用该方法,并在从方法调用成功返回后,将调用结果缓存在后备缓存提供程序(例如GemFire/Geode)中,以便下一次使用相同的输入调用方法调用,将返回缓存的值。

现在,如果您的应用程序正在使用客户端/服务器拓扑,那么客户端缓存当然会将请求转发到服务器,如果...

  1. 对应的客户区域是代理,或者...

  2. 对应的客户端Region是一个 CACHING_PROXY,客户端的本地客户端Region不包含Address的请求

我鼓励您在此处阅读有关不同客户端区域数据管理策略的更多信息。

要查看由Pivotal GemFire in Action支持的Spring 缓存抽象的另一个工作示例,请查看...

缓存示例

我在 SpringOne-2015 演讲中使用了这个示例来解释使用GemFire/Geode作为缓存提供程序的缓存。此特定示例向 REST API 发出外部请求以获取“每日报价”。

希望这可以帮助!

干杯,约翰

于 2016-07-28T19:40:15.307 回答