OkHttp 还实现了一个缓存机制,用于存储 HTTP 响应。缓存中的每个条目都是一个 CacheEntry 对象。这些缓存条目会被多个请求共享,这也是享元模式的一个应用。
public final class Cache {
private final Map<String, CacheEntry> cacheMap = new LinkedHashMap<>();
private final long maxSize;
private final long maxAgeSeconds;
// 省略其他代码
synchronized CacheEntry get(Request request) {
String key = request.url().toString();
return cacheMap.get(key);
}
synchronized void put(Request request, Response response) {
String key = request.url().toString();
cacheMap.put(key, new CacheEntry(response));
if (cacheMap.size() > maxSize) {
evict();
}
}
private void evict() {
Iterator<Map.Entry<String, CacheEntry>> iterator = cacheMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, CacheEntry> entry = iterator.next();
if (entry.getValue().isExpired()) {
iterator.remove();
} else {
break;
}
}
}
}
在上述代码中,Cache 类使用一个 LinkedHashMap 来存储缓存条目。当需要获取或存储缓存时,都会检查或更新相应的缓存条目。这种共享缓存条目的方式减少了内存的使用,并提高了缓存命中率。