2016-07-28 58 views
0

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

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

问候,
佳日

回答

1

首先,我认为你缺少核心Spring框架的Cache Abstraction点。我鼓励您阅读更多关于缓存抽象的预期用途here。简而言之,如果其中一个应用程序对象调用某个“外部”,“昂贵”的服务来访问资源,那么缓存可能适用,特别是如果输入传递的结果每次都是完全相同的输出时间。

因此,让我们想象一下,让我们想象一下,您的应用程序调用Google Maps API中的Geocoding API来转换地址和(相反的)纬度/经度坐标。

你可能有一个应用程序春天@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; 

    ... 
} 

显然,给定一个纬度/经度(输入),它应该产生相同的地址(结果)每次。此外,由于对Google的地理编码服务等外部API进行(网络)调用可能非常昂贵,因此无论是访问资源还是执行转换,此类服务调用都是用于在我们的应用程序中缓存的最佳选择。

在众多other caching providers(例如的Ehcache,Hazelcaset,Redis的,等等),就可以了,当然,use举足轻重的GemFire,或开源的替代,阿帕奇的Geode备份春天的缓存抽象。

在你举足轻重的GemFire/阿帕奇的Geode设置,当然你也可以使用两peer-to-peer(P2P)或client/server拓扑结构,它并不真正的问题,并的GemFire /的Geode会做正确的事,一旦“呼吁”。

但是,在Cache Abstraction文档状态,当你拨打电话到您的应用程序组件的方法之一(如getAddressFor(:Point)),支持高速缓存(与@Cacheable)拦截器将首先制造方法之前“咨询”缓存呼叫。如果该值存在于缓存中,则返回该值,并且调用“昂贵的”方法调用(例如getAddressFor(:Point))将调用而不是

但是,如果没有高速缓存未命中,然后将在调用方法进行,并在从方法调用成功返回,缓存的后盾缓存提供了调用的结果(如的GemFire/Geode),以便下次使用相同的输入调用方法调用时,将返回缓存的值。

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

  1. 相应的客户端地区是一个代理,或...

  2. 相应的客户端地区是CACHING_PROXY,并在客户端的本地客户端地区不包含要求地址

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

要查看Spring的缓存抽象通过举足轻重的GemFire行动支持的另一实施,看看...

caching-example

我在SpringOne上,2015年的谈话中使用这个例子作为高速缓存提供者解释缓存与GemFire/Geode。这个特定的示例向REST API发出一个外部请求以获得“每日报价”。

希望这会有所帮助!

干杯, 约翰

+0

我意识到缓存抽象。我的问题是:如果getAddressFor函数在Gemfire的客户端/服务器部署模型中的客户端程序中运行,googleGeocodingApiDao.convert是否会被调用?我相信它不会,因为如果有缓存未命中,缓存请求将被转发到服务器。 GoogleGeocodingApiDao永远不会有机会获取数据。如果我错了,请纠正我。 – Yash

+0

无论您是使用客户端/服务器还是使用p2p,行为都是相同的。如果输入已经被缓存,Spring将首先“询问”缓存提供者(即GemFire)。如果客户端是“PROXY”(甚至是“CACHING_PROXY”),它将立即将请求转发给服务器。如果相应的服务器端区域(例如“Address”)不包含条目,则GemFire将返回** null **,并且Spring的Cache抽象将** null **标记为“缓存未命中”和“继续“来调用该方法,导致对'googleGeocodingApiDao.convert(:Point)'的调用。该调用的结果... –

+0

...将被缓存,这意味着缓存客户端(同样,一个'PROXY')将把值转发到服务器区域(“地址”)进行存储。随后调用'MyApplicationAddressService.getAddressFor(:Point)',给定相同的坐标,将导致结果被从GemFire中取出,然后'googleGeocodingApiDao.convert(:Point)'方法将不会**为调用。 –