如何实现缓存服务器?

时间:2015-06-27 13:24:55

标签: architecture redis client-server memcached soa

我今天有一个场景,大约有50,000个Windows客户端(用户)在一天内定期连续轮询独立服务器。出于安全原因,我没有提到服务器正在做什么,但它是具有内部部署安装的第三方供应商产品。因此,作为程序员,我无法控制它如何管理不同的请求,但我们知道使用其提供的API时几乎没有性能问题。此产品由于各种原因及其丰富的功能而不可或缺,我们无法转移到不同的产品,即使我们提出的主要问题我也不会解决。

我们已经构建了一个客户端应用程序,供我们组织内的用户使用,除了其他东西之外,我还需要对上面提到的服务进行API调用。现在我们发现这个调用对于某些重用例来说很昂贵。我确信服务器已经实现了某种内置缓存逻辑,但考虑到输入查询对此API的不同保真度,它将没有多大用处。

此API的主要功能是查询全局数据库并返回唯一项。例如:=>

//Return all names in database that begin with the user entered text.
NameCollection GetNamesBeginningWith(string inputText);

现在这是一个示例,而不是原始API。

现在我想在所有客户端和这个主服务器之间引入另一个缓存服务器。我最近了解到'redis'并且我打算用它来缓存所有记录,最多可以说200,000。因此,最初从我的redis实例中,我将读取该特定表的所有记录,并将这些记录放在缓存中,然后我的所有客户端现在将与我的redis实例通信,而不是直接与主服务器通信以用于此用例。

我主要是客户端开发人员,只具备服务器端细微差别的基本知识。我正走在正确的道路上吗?

'redis'是推荐的解决方案吗?

我所采取的数据也是不稳定的,因为它可能每月更改一次,或者某些数据可能永远不会改变很长时间以确保安全我计划安排每天早上刷新缓存的工作。我之前从未做过这样的事情。所以我问社区这是否是推荐的方法?

在这种情况下,如何在没有最终用户注意到的情况下刷新缓存?

2 个答案:

答案 0 :(得分:2)

正如汤姆已经说过你的解决方案一般都可以,Redis是一个不错的选择。我只是想提请你注意可用性问题。从您的问题看,您的所有客户似乎都将直接从Redis读取数据。问题是Redis服务器或其代理可能由于多种原因而停机,除了一些服务器维护任务需要重启。如果您需要您的客户端全天候运行,您将不得不处理它。最常见的解决方案是使用至少一个从站配置Redis复制。请注意,这将需要一些Redis管理技能和大多数基础设施的额外费用。看起来有点复杂不是吗?如果我是你,我不会这样做,并首先从简单的延迟加载开始。您可以随时检查Redis缓存,然后检查它是空的还是不可用以旧方式从API读取数据。在这种情况下,如果redis关闭,您的客户端将在线,但速度很慢。当Redis启动时,您根本无需触摸API。

  

在这种情况下,如何在没有最终用户注意的情况下刷新缓存   它?

我在这里看不到问题。您的工作应该只是从API读取数据并按计划更新Redis。 Redis将处理所有并发事务。

希望它有所帮助!

答案 1 :(得分:1)

  

我走的是正确的道路吗?

我认为一般来说,如果数据只是逐月变化而不是逐秒变化,那么您的方法就会起作用。

  

' redis'推荐的解决方案?

毫无疑问,Redis推荐并且它是快乐的用户。如果您需要缓存,请确保Redis可以使用。 Memcached也。

  

在这种情况下,如何在没有最终用户注意的情况下刷新缓存   它?

许多缓存技术都内置了一些机制,允许您将源数据中的数据更改实时同步到构成缓存的所有节点,而不会中断。我知道Oracle Coherence就是这种情况。我不知道Redis是否支持这一点,但如果没有,我会感到惊讶。