Gemfire spring 示例

Gemfire spring example

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

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

此致,
亚什

首先,我认为你错过了核心 Spring Framework 的 Cache Abstraction. I encourage you to read more about the Cache Abstraction's intended purpose here.

简而言之,如果您的应用程序对象之一调用某些 "external"、"expensive" 服务来访问资源,那么缓存可能适用,尤其是如果传递的输入导致每次输出完全相同。

所以,让我们暂时想象一下您的应用程序调用 Geocoding API in the Google Maps API 来转换地址和(反向)latitude/longitude 坐标。

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

@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;

  ...
}

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

在许多 other caching providers (e.g. EhCache, Hazelcaset, Redis, etc), you can, of course, use Pivotal GemFire 或开源替代方案中,Apache Geode 支持 Spring的缓存抽象。

在您的 Pivotal GemFire/Apache Geode 设置中,您当然可以使用 peer-to-peer (P2P) or client/server 拓扑,它不会这真的很重要,GemFire/Geode 会做正确的事,一旦 "called upon".

但是,Spring Cache Abstraction 文档指出,当您调用其中一个应用程序组件方法(例如 getAddressFor(:Point) ) 支持缓存(使用 @Cacheable)拦截器将在进行方法调用之前首先 "consult" 缓存。如果该值存在于缓存中,则该值被 returned 并且 "expensive" 方法调用(例如 getAddressFor(:Point))将 不被调用 .

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

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

  1. 对应的clientRegion是PROXY,或者...

  2. 对应的clientRegion是一个CACHING_PROXY,client的local client-side Region Address.

  3. 不包含请求的 Point

我鼓励您阅读更多有关不同客户区域数据管理政策的信息here

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

caching-example

我在我的 SpringOne-2015 演讲中使用了这个示例来解释使用 GemFire/Geode 作为缓存提供程序的缓存。此特定示例向 REST API 发出外部请求以获取 "Quote of the Day".

希望对您有所帮助!

干杯, 约翰