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 拓扑,那么客户端缓存当然会将请求转发到服务器,如果...
对应的clientRegion是PROXY,或者...
对应的clientRegion是一个CACHING_PROXY,client的local client-side Region Address.
不包含请求的 Point
我鼓励您阅读更多有关不同客户区域数据管理政策的信息here。
要在 Action 中查看 Spring 的缓存抽象 的另一个工作示例,由 Pivotal GemFire 支持,请查看在...
我在我的 SpringOne-2015 演讲中使用了这个示例来解释使用 GemFire/Geode 作为缓存提供程序的缓存。此特定示例向 REST API 发出外部请求以获取 "Quote of the Day".
希望对您有所帮助!
干杯,
约翰
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 拓扑,那么客户端缓存当然会将请求转发到服务器,如果...
对应的clientRegion是PROXY,或者...
对应的clientRegion是一个CACHING_PROXY,client的local client-side Region Address.
不包含请求的 Point
我鼓励您阅读更多有关不同客户区域数据管理政策的信息here。
要在 Action 中查看 Spring 的缓存抽象 的另一个工作示例,由 Pivotal GemFire 支持,请查看在...
我在我的 SpringOne-2015 演讲中使用了这个示例来解释使用 GemFire/Geode 作为缓存提供程序的缓存。此特定示例向 REST API 发出外部请求以获取 "Quote of the Day".
希望对您有所帮助!
干杯, 约翰