面试题答案
一键面试资源管理优化
- 原理:高并发场景下,过多的网络请求可能耗尽系统资源(如网络连接数、内存等)。合理管理资源能确保系统稳定运行。例如,限制同时进行的网络请求数量,避免资源过度消耗。
- 实现:
import 'dart:async';
import 'package:http/http.dart' as http;
// 创建一个容量为5的信号量,即最多同时处理5个请求
final semaphore = Semaphore(5);
class NetworkService {
Future<http.Response> makeRequest(Uri url) async {
// 获取信号量
await semaphore.acquire();
try {
return await http.get(url);
} finally {
// 释放信号量
semaphore.release();
}
}
}
class Semaphore {
final int _capacity;
int _count;
final Queue<Future<void>> _queue = Queue();
Semaphore(this._capacity) : _count = _capacity;
Future<void> acquire() async {
if (--_count < 0) {
Completer<void> completer = Completer();
_queue.add(completer.future);
return completer.future;
}
}
void release() {
if (_count++ < _capacity) {
if (_queue.isNotEmpty) {
_queue.removeFirst().complete();
}
}
}
}
请求队列优化
- 原理:将网络请求加入队列,按顺序或根据优先级依次处理,避免同时发起过多请求造成资源竞争。这可以保证请求有序进行,减少资源争用导致的错误。
- 实现:
import 'dart:async';
import 'package:http/http.dart' as http;
class RequestQueue {
final Queue<Future<http.Response>> _queue = Queue();
final StreamController<http.Response> _responseController = StreamController<http.Response>();
Stream<http.Response> get responseStream => _responseController.stream;
void addRequest(Uri url) {
_queue.add(_makeRequest(url));
_processQueue();
}
Future<http.Response> _makeRequest(Uri url) async {
return await http.get(url);
}
void _processQueue() async {
while (_queue.isNotEmpty) {
var response = await _queue.removeFirst();
_responseController.add(response);
}
}
void dispose() {
_responseController.close();
}
}
缓存策略优化
- 原理:对于相同的网络请求,先检查缓存中是否有可用数据,若有则直接返回,避免重复请求,减少网络开销和响应时间。这可以大大减轻服务器负担,提高应用性能。
- 实现:
import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:collection/collection.dart';
class CacheManager {
final Map<Uri, http.Response> _cache = {};
final Map<Uri, DateTime> _cacheTimestamps = {};
final Duration _cacheDuration = const Duration(minutes: 5);
Future<http.Response> get(Uri url) async {
if (_cache.containsKey(url) &&
DateTime.now().difference(_cacheTimestamps[url]!) < _cacheDuration) {
return _cache[url]!;
}
var response = await http.get(url);
_cache[url] = response;
_cacheTimestamps[url] = DateTime.now();
return response;
}
}
综合使用这些优化策略,可以显著提升高并发Flutter应用网络请求的稳定性。资源管理确保系统资源合理使用,请求队列保证请求有序处理,缓存策略减少重复请求,它们共同作用于应用的网络层,提升整体性能。