[英]Modify logic of what to do when cache is full in Retrofit/OkHttp?
我正在尝试定义我自己的缓存满时如何处理的逻辑,因为不需要实际行为。 我不知道这是否可能(我还没有找到关于这个主题的任何文档),所以我在这里问。
当缓存已满时,Retrofit/OkHttp 将根据其有效期删除缓存的响应,优先考虑这些响应,这些响应会更快过期。
简单的例子:
如果我们有一个例如 1MB 的空缓存,并且响应大小为 700KB,在 1 小时内过期(缓存控制:max-age=3600),然后是大小为 800KB 的不同响应(它不再适合缓存) 在 30 分钟后过期,则不会缓存第二个响应。
另一个例子:
在 1MB 缓存中,我们有 800KB 响应在 1 小时后过期,然后另一个响应有 800KB 在 5 小时后过期。 删除 1 小时响应并存储 5 小时响应。
我想更改此行为,即根据接收时间(OkHttp-Received-Millis 属性)而不是过期时间从缓存中删除响应,因此首先删除最旧的响应。
创建 http 客户端和 retrofit 初始化:
private Retrofit retrofit(String baseUrl) {
return new Retrofit.Builder()
.baseUrl(baseUrl)
.client(cachingClient(CACHE_IDENTIFIER))
.addConverterFactory(GsonConverterFactory.create(gson()))
.build();
}
private OkHttpClient cachingClient(String identifier) {
return new OkHttpClient.Builder()
.cache(cache(identifier))
.addInterceptor(InterceptorsKt.authorizationInterceptor(Credentials.basic(USER, PASSWD)))
.build();
}
private Cache cache(String identifier) {
return new Cache(new File(context.get().getCacheDir(), identifier), CACHE_SIZE);
}
缓存响应调用的结构:
http://example.com:8754/random/hello
GET
0
HTTP/1.1 200
11
Cache-Control: max-age=2592000, immutable
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 21 Sep 2022 08:01:31 GMT
Keep-Alive: timeout=60
Connection: keep-alive
OkHttp-Sent-Millis: 1663747322078
OkHttp-Received-Millis: 1663747322254
还有一次,实际行为是根据现在的计算时间+ max-age (首先删除最低的)从缓存中删除响应(当它已满时),而想要的行为是根据OkHttp-Received-Millis删除最旧的。
这样的事情可能吗?
OkHttp 的缓存会驱逐最近最少使用的项目。 在做出驱逐决定时,它不考虑一个项目的新鲜时间。
没有 API 可以更改此策略。 如果您想手动从缓存中逐出项目,您可以使用缓存的iterator
并在您决定应该被逐出的项目上调用remove
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.