https://spring.io/guides/gs/caching-gemfire/的示例显示,如果存在缓存未命中,我们必须从服务器获取数据并将其存储在缓存中。Gemfire弹簧示例
这是Gemfire作为Gemfire服务器运行的例子,还是Gemfire客户端?我认为如果存在缓存未命中,客户端会自动从服务器获取数据。如果是这样的话,会不会有客户端的缓存未命中?
问候,
佳日
https://spring.io/guides/gs/caching-gemfire/的示例显示,如果存在缓存未命中,我们必须从服务器获取数据并将其存储在缓存中。Gemfire弹簧示例
这是Gemfire作为Gemfire服务器运行的例子,还是Gemfire客户端?我认为如果存在缓存未命中,客户端会自动从服务器获取数据。如果是这样的话,会不会有客户端的缓存未命中?
问候,
佳日
首先,我认为你缺少核心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拓扑结构,那么当然,客户端缓存将请求转发到服务器是否......
相应的客户端地区是一个代理,或...
相应的客户端地区是CACHING_PROXY,并在客户端的本地客户端地区不包含要求点为地址。
我鼓励您阅读有关不同客户端区域数据管理政策here的更多信息。
要查看Spring的缓存抽象通过举足轻重的GemFire行动支持的另一实施,看看...
我在SpringOne上,2015年的谈话中使用这个例子作为高速缓存提供者解释缓存与GemFire/Geode。这个特定的示例向REST API发出一个外部请求以获得“每日报价”。
希望这会有所帮助!
干杯, 约翰
我意识到缓存抽象。我的问题是:如果getAddressFor函数在Gemfire的客户端/服务器部署模型中的客户端程序中运行,googleGeocodingApiDao.convert是否会被调用?我相信它不会,因为如果有缓存未命中,缓存请求将被转发到服务器。 GoogleGeocodingApiDao永远不会有机会获取数据。如果我错了,请纠正我。 – Yash
无论您是使用客户端/服务器还是使用p2p,行为都是相同的。如果输入已经被缓存,Spring将首先“询问”缓存提供者(即GemFire)。如果客户端是“PROXY”(甚至是“CACHING_PROXY”),它将立即将请求转发给服务器。如果相应的服务器端区域(例如“Address”)不包含条目,则GemFire将返回** null **,并且Spring的Cache抽象将** null **标记为“缓存未命中”和“继续“来调用该方法,导致对'googleGeocodingApiDao.convert(:Point)'的调用。该调用的结果... –
...将被缓存,这意味着缓存客户端(同样,一个'PROXY')将把值转发到服务器区域(“地址”)进行存储。随后调用'MyApplicationAddressService.getAddressFor(:Point)',给定相同的坐标,将导致结果被从GemFire中取出,然后'googleGeocodingApiDao.convert(:Point)'方法将不会**为调用。 –