📜  dio 缓存颤动 (1)

📅  最后修改于: 2023-12-03 15:30:27.360000             🧑  作者: Mango

Dio 缓存颤动

Dio 是一款基于 Flutter 的网络请求库,提供了丰富的功能和易用的 API,支持各种请求方式和数据格式。它的缓存机制也是很重要的一个功能,可以提高网络请求的效率和稳定性。

缓存策略

Dio 支持多种缓存策略,可以根据需求选择合适的策略,或自定义缓存规则。它提供了以下几种缓存策略:

  • Options.connectTimeout:连接超时时间,单位为毫秒
  • Options.receiveTimeout:响应超时时间,单位为毫秒
  • Options.extra:扩展信息
  • Options.headers:请求头信息
  • Options.method:请求方式
  • Options.data:请求数据
  • Options.queryParameters:查询参数
  • Options.contentType:请求的 content-type 类型
  • Options.responseType:响应数据类型
  • Options.validateStatus:自定义验证状态码合法性的方法
  • Options.followRedirects:是否自动跟随重定向
  • Options.maxRedirects:最大重定向次数
  • Options.requestEncoder:将请求数据编码为字符串的方法
  • Options.responseDecoder:将响应数据解码为对象的方法
  • Options.listFormat:将查询参数转为字符串时数组的展开方式
缓存交互

Dio 支持请求数据时的缓存和响应数据的缓存,可以通过设置 Options.extra 属性,指定缓存时间、缓存文件路径等参数来控制缓存交互。

  • 请求数据缓存:使用 DioCacheManager 来缓存网络请求的数据,可以指定缓存时间和路径等参数,提高网络请求效率,并可以在没有网络连接的情况下提供缓存数据。
Future<Response<dynamic>> get(BuildContext context) async {
    final dio = Dio(BaseOptions(extra: {'cacheOptions': CacheOptions(expiry: const Duration(days: 7))}));

    final cacheManager = await CacheManager.getInstance();

    dio.interceptors.add(CacheInterceptor(requestPayload: true, cacheStore: await cacheManager.getStore()));

    final url = 'https://www.example.com/api/...';
    final response = await dio.get<dynamic>(url);

    return response;
}
  • 响应数据缓存:使用 Options.extra['cacheOptions'] 属性来缓存网络请求的响应数据,可以存储在内存或文件中,提供下一次访问时的缓存数据。
Future<Response<dynamic>> get(BuildContext context) async {
    final dio = Dio();

    dio.interceptors.add(CacheInterceptor(requestPayload: true));

    final url = 'https://www.example.com/api/...';
    final response = await dio.get<dynamic>(url, options: Options(extra: {'cacheOptions': CacheOptions(priority: CachePriority.normal)}));

    return response;
}
缓存存储

Dio 支持将缓存数据存储在内存或文件系统中,可以通过设置不同的缓存存储方式,提供不同的缓存性能和稳定性。

  • 内存存储:使用 MemoryCacheStore 存储缓存数据,可以快速获取缓存数据,并能够较快将数据从内存中删除或更新。
final cacheManager = CacheManager(
  Config(
    'myapp',
    stalePeriod: const Duration(days: 30),
    maxNrOfCacheObjects: 20,
    repo: MemCacheStore(),
  ),
);
  • 文件存储:使用 JsonCacheStore 存储缓存数据,可以将缓存数据保存到文件系统中,有较高的稳定性和可靠性,但读写速度较慢。
final cacheManager = CacheManager(
  Config(
    'myapp',
    stalePeriod: const Duration(days: 30),
    maxNrOfCacheObjects: 20,
    repo: JsonCacheStore(),
    fileService: FileService(),
  ),
);
震动效果

Dio 的缓存颤动即为当需要请求数据时,先从缓存中获取数据,同时也发起网络请求,当网络请求返回数据后,缓存中的数据会自动更新,实现了缓存颤动的效果。

final cacheOptions = CacheOptions(store: MemoryCacheStore(), policy: CachePolicy.refreshExpire);

final dio = Dio(BaseOptions(
  baseUrl: 'https://jsonplaceholder.typicode.com/',
  connectTimeout: 5000,
  receiveTimeout: 100000,
  headers: <String, dynamic>{
    'User-Agent': 'dio',
    'Common-Header': 'xxx',
  },
  contentType: Headers.jsonContentType,
  responseType: ResponseType.json,
  followRedirects: false,
  maxRedirects: 5,
  requestEncoder: (_, __) => utf8.encode(_),
  responseDecoder: (_, __) => utf8.decode(_),
));

d('Get User Object Example', () async {
  final response = await dio.get('/users/1',
      options: Options(
          extra: {'cacheOptions': cacheOptions},
          headers: {'test': 'header'},
          baseUrl: 'https://www.google.com/')
  );

  print(response.data);
});

可见,Dio 缓存颤动 机制可以帮助开发者更高效地进行网络数据获取,减少无谓的请求和响应,进一步减轻服务器压力,提高应用的性能和用户体验。