首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制缓存刷新

强制缓存刷新
EN

Software Engineering用户
提问于 2015-09-15 15:54:13
回答 3查看 5.2K关注 0票数 0

我正在更新一个现有的tomcat应用程序,以从REST中读取某些资源。目前,应用程序从平面文件中读取它们。由于应用程序非常关键,所以我添加了一个缓存层,以便REST返回的对象总是可用的。

在API客户端的服务层中,如果在缓存中找不到请求项,则将请求发送到实际的API中,将响应放入MapDB缓存并返回给调用方。启动监听器调用一堆具有不同参数的API,以便所有数据都在MapDB缓存中。我不对缓存中的项设置过期,因为我希望它们始终可用,除非我按需刷新。

问题是Web和API客户端是不同的项目。由于API客户端决定从Cache或API读取,所以我无法强制从应用程序中刷新缓存值。

  • 如果我向API客户机或对象obj = ServiceFactory.getLanguageService() .getLanguagesFromApi(env.getName(),env.getEnvironmentType(),env.getPhase().toString(),null,true)的函数调用添加另一个参数;

最后一个"true“参数指示强制刷新缓存。

  • 如果我将缓存中的现有值获取到一个临时变量,删除条目,进行API调用,如果由于某些错误而没有返回值,则将条目放回缓存中。String key = ClientUtils.concatenateList( ClientUtils.concatenateList env.getName(),env.getEnvironmentType(),env.getPhase(),null),ClientConstants.CACHE_KEY_SEPERATOR,ClientConstants.NULL_STRING);Object cachedElement = ClientCache.getCache().get(key);如果(cachedElement != null) { ClientCache.getCache().delete(key);} Object obj = ServiceFactory.getLanguageService() .getLanguagesFromApi(env.getName(),env.getEnvironmentType(),env.getPhase().toString(),null);如果(obj == null) { ClientCache.getCache().put(key,cachedElement);}

有什么更干净的方法可以做到这一点?我觉得向函数中添加有关缓存的参数会使它变得笨拙,并添加依赖项--比如getUsers(String country, boolean forceAPIrequest)。但是删除和添加相同的条目也会浪费资源和堆空间,从而导致GC时间的推移。此外,App将直接访问客户端缓存来执行这些操作。

所有这些都是基于强烈的假设,即REST是不可靠的。Web应用程序不应该有任何停机时间。

EN

回答 3

Software Engineering用户

发布于 2015-09-16 11:36:40

如果我正确理解,缓存的位置主要是为了在REST服务不可用的情况下的可实现性,而不是为了性能。

在这种情况下,每次收到客户端的请求时都可以调用REST服务,如果得到响应(REST服务正在工作),则更新MapDB缓存并将响应返回给API。如果REST服务关闭,并且没有得到响应,只需从MapDB返回缓存的值即可。

这样,您的客户总是得到尽可能最新的可能版本,同时保持可靠性要求。

您可以在对客户端的响应中包含一个标志,指示响应是来自缓存还是最新响应。对于绝对需要最新响应的客户端来说,这可能是有用的,因为与处理旧数据相比,失败更可取。

票数 1
EN

Software Engineering用户

发布于 2015-09-17 13:39:15

向API客户端refreshCache(...)添加一个方法,该方法将刷新整个缓存,类似于通过启动侦听器所做的操作。如果使用API客户端的缓存感知应用程序在请求特定数据之前知道需要刷新数据,那么首先让它调用refreshCache

票数 0
EN

Software Engineering用户

发布于 2015-09-15 18:25:30

您先做的调用S完成缓存刷新是吗?如果那样的话,为什么不安排一下呢。如果完整的请求返回良好,那么刷新并重新实例化缓存..。

票数 -2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/297338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档