Architecture 如何实现缓存服务器?

Architecture 如何实现缓存服务器?,architecture,redis,client-server,memcached,soa,Architecture,Redis,Client Server,Memcached,Soa,我今天有一个场景,大约50000个windows客户端(用户)每天定期轮询一个独立服务器。出于安全原因,我没有提到服务器正在做什么,但它是一个内部安装的第三方供应商产品。因此,作为一名程序员,我无法控制它如何管理不同的请求,但我们知道,在使用它提供的API时,几乎没有性能问题。此外,由于各种原因和其广泛的功能,该产品是不可或缺的,我们不能转移到其他产品,即使我们转移,我将要提到的主要问题也没有得到解决 我们已经构建了一个客户机应用程序,该应用程序由我们组织内的用户使用,该应用程序与其他应用程序不

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

我们已经构建了一个客户机应用程序,该应用程序由我们组织内的用户使用,该应用程序与其他应用程序不同,需要对我上面提到的服务进行API调用。现在我们发现,对于某些重使用情形,这个调用是昂贵的。我确信服务器实现了某种内置的缓存逻辑,但考虑到输入查询对该API的保真度不同,它没有多大用处

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

//Return all names in database that begin with the user entered text.
NameCollection GetNamesBeginningWith(string inputText);
现在,这是一个示例,而不是原始API

现在我考虑在所有客户机和主服务器之间引入另一个缓存服务器。我最近了解了“redis”,并计划使用它来缓存所有记录,比如说最大20万条记录。因此,最初从我的redis实例中,我将读取该特定表的所有记录,并将这些记录保存在缓存中,然后我的所有客户机现在将与我的redis实例通信,而不是直接与该用例的主服务器通信

我主要是一名客户端开发人员,只掌握服务器端细微差别的基本知识。我走的路对吗

“redis”是推荐的解决方案吗

此外,我正在获取的数据是不稳定的,因为它可能每月更改一次,或者某些数据可能在很长时间内不会更改,因此为了安全起见,我计划安排一项每天早上刷新缓存的作业。我以前从未做过这样的事。因此,我问社区,这是否一种推荐的方法

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

我走的路对吗

我认为通常情况下,您的方法会起作用,尤其是如果数据只是逐月变化,而不是逐秒变化

“redis”是推荐的解决方案吗

毫无疑问,它是由Redis推荐的,用户也很开心。如果你需要缓存,当然,Redis可以工作。Memcached也是

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


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

因为Tom已经说过,您的解决方案总体上是可以的,Redis是一个不错的选择。我只想提请您注意可用性问题。从您的问题来看,您的所有客户都将直接从Redis读取数据。问题是Redis服务器或其代理可能会由于多种原因而停机,此外,一些服务器维护任务将需要重新启动。如果你需要你的客户全天候运行,你就必须处理它。最常见的解决方案是使用至少一个从机配置Redis复制。请注意,这将需要一些Redis管理技能和基础设施的额外开支。看起来有点复杂,不是吗?如果我是你,我不会这样做,我会先从简单的延迟加载开始。你可以先检查你的Redis缓存,然后如果它是空的或不可用的,用老方法从API读取数据。在这种情况下,如果redis停机,您的客户端将联机,但速度很慢。当Redis启动时,您根本不需要接触API

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

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

希望有帮助