gpt4 book ai didi

java - 缓存在 JAX-RS 中是如何工作的?

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:58 25 4
gpt4 key购买 nike

假设我有以下使用 @GET 方法的网络服务调用:

@GET
@Path(value = "/user/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUserCache(@PathParam("id") String id, @Context HttpHeaders headers) throws Exception {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession();
Cre8Mapper mapper = session.getMapper(Cre8Mapper.class);

// slow it down 5 seconds
Thread.sleep(5000);

// get data from database
User user = mapper.getUser(map);

if (user == null) {
return Response.ok().status(Status.NOT_FOUND).build();
} else {
CacheControl cc = new CacheControl();
// save data for 60 seconds
cc.setMaxAge(60);
cc.setPrivate(true);
return Response.ok(gson.toJson(user)).cacheControl(cc).status(Status.OK).build();
}
}

为了实验,我在从数据库中获取数据之前将当前线程减慢了 5 秒。
当我使用 Firefox Poster 调用我的网络服务时,在 60 秒内,第 2、3 次调用等似乎快得多,直到超过 60 秒。
但是,当我将 URI 粘贴到浏览器(Chrome)时,它似乎每次都慢了 5 秒。我真的很困惑缓存实际上是如何用这种技术完成的。这是我的问题:

  1. POSTER 是否真的查看标题 max-age 并决定何时获取数据?
  2. 在客户端(网络、安卓....),当访问我的网络服务时,我需要检查标题然后手动执行缓存或浏览器已缓存数据本身?
  3. 有没有办法避免从数据库中获取数据每次?我想我必须以某种方式将我的数据存储在内存中,但它可能会耗尽内存吗?
  4. 在本教程中 JAX-RS caching tutorial :缓存实际上是如何工作的?第一行总是从数据库中获取数据:

    Book myBook = getBookFromDB(id);

那么它是如何被认为是缓存的呢?除非代码不按上/下顺序执行。

    @Path("/book/{id}")
@GET
public Response getBook(@PathParam("id") long id, @Context Request request) {
Book myBook = getBookFromDB(id);
CacheControl cc = new CacheControl();
cc.setMaxAge(86400);
EntityTag etag = new EntityTag(Integer.toString(myBook.hashCode()));
ResponseBuilder builder = request.evaluatePreconditions(etag);
// cached resource did change -> serve updated content
if (builder == null){
builder = Response.ok(myBook);
builder.tag(etag);
}
builder.cacheControl(cc);
return builder.build();
}

最佳答案

从你的问题中我看到你混合了客户端缓存(http)和服务器端缓存(数据库)。我认为这的根本原因是您首先在 firefox 和 chrome 中观察到的不同行为我会尝试清除它

When I call my web service using Firefox Poster, within 60 seconds it seemed much faster on the 2nd, 3rd calls and so forth, until it passed 60 seconds. However, when I paste the URI to a browser (Chrome), it seemed to slow down 5s everytime.

示例:

 @Path("/book")
public Response getBook() throws InterruptedException {
String book = " Sample Text Book";
TimeUnit.SECONDS.sleep(5); // thanks @fge
final CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge((int) TimeUnit.MINUTES.toSeconds(1));
return Response.ok(book).cacheControl(cacheControl).build();
}

我已经启动并运行了一个 Restful 网络服务,它的 url 是

http://localhost:8780/caching-1.0/api/cache/book - GET

火狐:

当我第一次访问 url 时,浏览器向服务器发送请求并得到带有缓存控制 header 的响应。

fiefox initital req

60 秒内的第二个请求(使用 Enter):这次 firefox 没有去服务器获取响应,而是从缓存中加载数据

enter image description here

60 秒后的第三个请求(使用 Enter):

这次 firefox 向服务器发出请求并得到响应。

第四个请求使用刷新(F5 或 ctrl F5):

如果我在前一个请求的 60 秒内刷新页面(而不是按回车键),firefox 不会从缓存中加载数据,而是向服务器发出请求并在请求中使用特殊 header

enter image description here

Chrome :

第二个请求在 60 秒内(使用 Enter):这次 chrome 再次向服务器发送请求而不是从缓存中加载数据,并且在请求中添加了 header cache-control = "max-age=0"

聚合结果:

由于 chrome 对输入点击的响应不同,您在 firefox 和 chrome 中看到了不同的行为,这与 jax-rs 或您的 http 响应无关。总而言之,客户端(firefox/chrome/safari/opera)会在缓存控制中缓存指定时间段的数据,客户端不会向服务器发出新请求,除非时间到期或我们强制刷新。

我希望这能澄清您的问题 1、2、3。

4.In this tutorial JAX-RS caching tutorial: How does caching actually work? The first line always fetch the data from the database:

Book myBook = getBookFromDB(id);

So how it is considered cached? Unless the code doesn't execute in top/down order.

您提到的示例不是在谈论最小化数据库调用,而是在谈论通过网络节省带宽,客户端已经有数据并与服务器检查(重新验证)是否更新数据,如果没有数据更新您正在发送实际实体的响应。

关于java - 缓存在 JAX-RS 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17481839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com