【问题标题】:How do I implement client side http caching like a browser?如何像浏览器一样实现客户端 http 缓存?
【发布时间】:2011-10-01 06:33:07
【问题描述】:

我使用 RESTFul 服务作为前端的后端。该服务在其响应中设置 expires/etag/lastmodified 标头。

我正在寻找的是一个客户端(最好是 java)库,它可以从服务中获取数据并将其缓存在像 ehcache 这样的可插入缓存后端中。

我还希望能够在条目失效后立即使用后台工作线程自动启动缓存。此外,执行条件 GET 应该很聪明。

我遇到过 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html

还有其他人知道的图书馆吗?这不是一个相当普遍的问题吗?

【问题讨论】:

    标签: http restlet resteasy http-caching


    【解决方案1】:

    Apache HttpComponents 库的 4.0+ 版本带有 HTTP 1.1 缓存支持。您可以将其与 Spring RestTemplate restful 客户端一起使用,如下所示:

        CacheConfig cacheConfig = new CacheConfig();  
        cacheConfig.setMaxCacheEntries(1000);
        cacheConfig.setMaxObjectSize(8192);
    
        HttpClient cachingClient = new CachingHttpClient(new DefaultHttpClient(), cacheConfig);
    
        ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(cachingClient);
        RestTemplate rest = new RestTemplate(requestFactory);
    

    【讨论】:

      【解决方案2】:

      Java 中客户端 HTTP 缓存的情况并不是特别好。这是一个不小的问题,大多数 HTTP 客户端库开发人员都没有攻击过。

      我认为这种情况正在缓慢变化,但我无法提供明确的指针。一个好的开始方法是查看 JAX-RS 的各种实现,这些实现带有客户端 API,例如 Jersey(它没有客户端缓存)。可能是 Restlet 有一个或 Restfulie,请检查。

      这是我通过 Google 找到的:

      http://xircles.codehaus.org/projects/httpcache4j

      您也可以尝试自己滚动,但您必须小心理解缓存标头(包括 Vary:) 才能正确使用。

      【讨论】:

        【解决方案3】:

        RestEasy 具有client side caching 机制,如果您使用此类客户端,启动和运行该机制很简单。

        RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
        YourService proxy = ProxyFactory.create(YourService.class, url);
        
        LightweightBrowserCache cache = CacheFactory.makeCacheable(proxy);
        

        您首先创建一个客户端代理实例,然后将其包裹在缓存中。就是这样。

        【讨论】:

          猜你喜欢
          • 2011-04-06
          • 1970-01-01
          • 2015-07-30
          • 1970-01-01
          • 2012-01-10
          • 2018-08-12
          • 1970-01-01
          • 1970-01-01
          • 2013-09-11
          相关资源
          最近更新 更多