2010-04-09 39 views
0

我目前正在使用CouchDB和RESTlet实现REST Web服务。所述的Restlet层是主要用于认证和通过CouchDB的服务的JSON数据的一些过滤:缓存身份验证数据

客户< = HTTP => [的Restlet < = HTTP =>的CouchDB]

我使用的CouchDB还存储用户登录数据,因为我不想为此添加额外的数据库服务器。因此,对我的服务的每个请求都会导致由RESTlet执行的两个CouchDB请求(auth数据+“真实”请求)。为了尽可能保持服务效率,我想减少请求的数量,在这种情况下请求登录数据。

我现在的想法是在缓存登录数据的RESTlet应用程序中提供一个缓存(即通过LinkedHashMap的LRU缓存),因为HTTP缓存可能不够。但是,例如,一旦用户更改密码,我如何使缓存数据无效。由于REST,应用程序可能会并行运行在多个服务器上,我不想创建一个中央实例来缓存登录数据。

当前,我将请求的auth数据保存在缓存中,并尝试使用它们来验证新请求。如果身份验证失败或现在有条目可用,我将向我的CouchDB存储发送一个GET请求,以获取实际的身份验证数据。 因此,在最坏的情况下,已更改其数据的用户可能仍能够使用旧凭证登录。我该如何处理?

或者什么是一个好的策略来保持缓存(s)最新一般?

在此先感谢。

回答

1

对我来说,看起来你已经长大到足以使用一些“专业”缓存解决方案(例如EHCache)。所有分布式缓存允许在不同节点之间进行新的数据复制&失效,因此您的问题已经解决。

+0

感谢您的回答,我正在看看EHCache。我不确定额外的开销是否由我的使用证明是合理的。也许我会缓存每个实例的所有条目,并给他们一个额外的租约。 – 2010-04-11 09:32:09

+0

正如您接受我的回答,是否意味着您正在切换到EHCache?只是好奇。 – mindas 2010-04-14 11:21:23

1

像memcached这样的分布式内存缓存可能就是您要查找的内容。您可以配置对象时代,缓存大小,并公开回调以从缓存中移除特定对象(如信息陈旧时)。

+0

感谢您的回答,显然没有集中式实例就没有解决方案(分布式缓存也是某种集中式实体)。 – 2010-04-11 09:30:44