面试题答案
一键面试缓存存储位置
- 内存缓存:在应用运行期间,将网络请求的数据临时存储在内存中。优点是访问速度极快,能快速响应请求。例如,可以使用
Map
数据结构在Dart代码中实现简单的内存缓存。在Flutter应用的状态管理中,如Provider
或GetX
管理的状态中添加缓存数据字段来存储。但缺点是应用关闭或内存不足时数据会丢失。 - 本地文件缓存:将数据存储到设备的本地文件系统。Flutter可以使用
path_provider
插件获取应用的本地存储目录。这种方式适合存储较大且需要长期保存的数据,数据不会因应用关闭而丢失。例如将网络请求得到的JSON数据以文件形式保存到本地,下次请求相同数据时先从文件读取。 - 数据库缓存:使用数据库来存储缓存数据,如
sqflite
插件(适用于Android和iOS)。数据库能提供更结构化的数据存储和查询功能,适合缓存复杂数据结构和需要进行条件查询的数据。例如可以创建表来存储网络请求的URL作为主键,对应的响应数据作为字段值进行缓存。
缓存有效期判断
- 设置固定有效期:在缓存数据时,同时记录缓存的时间戳。每次从缓存读取数据时,计算当前时间与缓存时间戳的差值,与预设的有效期比较。例如,如果设置有效期为1小时(3600秒),缓存数据时记录当前时间
DateTime.now().millisecondsSinceEpoch
,读取时计算时间差,若大于3600000毫秒(1小时的毫秒数)则认为缓存过期。 - 基于数据更新标识:服务器端在数据发生变化时,返回给客户端一个更新标识(如版本号)。客户端缓存数据时,同时保存这个标识。下次请求时,先检查本地缓存的标识与服务器返回的标识是否一致,不一致则说明缓存过期,需要重新请求数据。
- 根据请求频率动态调整有效期:对于高频请求的数据,可以适当缩短缓存有效期,以保证数据的实时性;对于低频请求的数据,延长缓存有效期,减少不必要的网络请求。例如在应用中,用户信息这类不常变化且请求频率低的数据,缓存有效期可设置为1天;而实时消息列表这类高频请求的数据,缓存有效期可设置为几分钟。
实现流程
- 请求前检查缓存:在发起网络请求前,先根据请求的URL在缓存中查找对应的数据。如果找到且缓存未过期,则直接使用缓存数据,不再发起网络请求。
- 请求后更新缓存:当网络请求成功后,将返回的数据存储到缓存中,并记录缓存时间或更新标识等信息。若缓存数据已存在,则根据更新策略(如覆盖、合并等)处理新数据。
- 缓存清理:定期清理过期的缓存数据,避免缓存占用过多空间。可以在应用启动时或在后台线程中定时执行缓存清理任务,遍历缓存数据,删除过期的数据。