Redis と Dart を使用してキャッシュ侵入防御機能を開発する方法
最新の Web アプリケーションでは、キャッシュは一般的なパフォーマンス最適化テクノロジです。ただし、キャッシュ システムはキャッシュ侵入攻撃に対して脆弱になる可能性があります。キャッシュ侵入とは、キャッシュに存在しないデータをリクエストすることを指します。リクエストが頻繁に発生すると、大量の無効なリクエストがデータベースやその他のバックエンド サービスに直接アクセスすることになり、システムのパフォーマンスに影響を与えます。
キャッシュ侵入の問題を解決するために、Redis と Dart 言語を使用してキャッシュ侵入防御機能を開発できます。具体的な実装手順とサンプル コードは次のとおりです。
まず、pubspec.yaml ファイルを使用して Redis ライブラリをインポートします。 Dart プロジェクトでは、以下に示すように:
dependencies: redis: ^4.0.0
次に、pub get
コマンドを実行して、必要な依存関係を取得します。
次のコードを使用して Redis サーバーに接続します:
import 'package:redis/redis.dart'; Future<void> main() async { final redis = await RedisConnection.connect('localhost', 6379); }
必ず localhost を置き換えてください。
を # に置き換えます。 ##6379 を Redis サーバーの正しいホスト名とポート番号に置き換えます。
/api/data?id=123 のリクエストの場合、キャッシュ キーとして
data_123 を使用できます。
String createCacheKey(String dataType, String id) { return '$dataType_$id'; }
import 'package:redis/redis.dart'; class Cache { final RedisConnection _redis; Cache(this._redis); Future<String?> get(String key) async { final value = await _redis.get(key); if (value == null) { return null; } else if (value.isEmpty) { // 如果值为空字符串,则表示请求结果为空 return ''; } else { return value; } } Future<void> set(String key, String value, {Duration? expiration}) async { await _redis.set(key, value); if (expiration != null) { await _redis.expire(key, expiration.inSeconds); } } } class DataService { final Cache _cache; DataService(this._cache); Future<String> getData(String id) async { final cacheKey = createCacheKey('data', id); final cachedValue = await _cache.get(cacheKey); if (cachedValue != null) { return cachedValue; } // 从后端服务获取数据 final data = await fetchDataFromBackendService(id); // 如果数据不存在,则将空字符串存储到缓存中,避免重复查询 final expiration = data.isNotEmpty ? Duration(minutes: 5) : Duration(seconds: 30); await _cache.set(cacheKey, data, expiration: expiration); return data; } Future<String> fetchDataFromBackendService(String id) async { // 从后端服务获取数据的实现代码 } } Future<void> main() async { final redis = await RedisConnection.connect('localhost', 6379); final cache = Cache(redis); final dataService = DataService(cache); final data = await dataService.getData('123'); print('Data: $data'); }Onこの例では、まず
Cache クラスを作成して Redis との対話をカプセル化します。次に、
DataService クラスを作成してデータ取得ロジックを実装します。
getData メソッドでは、まずリクエストされたデータをキャッシュから取得しようとします。データが存在しない場合は、バックエンド サービスからデータを取得し、結果をキャッシュに保存します。
以上がRedis と Dart を使用してキャッシュ侵入防御機能を開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。