ホームページ  >  記事  >  データベース  >  Redis と Dart を使用してキャッシュ侵入防御機能を開発する方法

Redis と Dart を使用してキャッシュ侵入防御機能を開発する方法

WBOY
WBOYオリジナル
2023-09-22 08:12:251058ブラウズ

Redis と Dart を使用してキャッシュ侵入防御機能を開発する方法

Redis と Dart を使用してキャッシュ侵入防御機能を開発する方法

最新の Web アプリケーションでは、キャッシュは一般的なパフォーマンス最適化テクノロジです。ただし、キャッシュ システムはキャッシュ侵入攻撃に対して脆弱になる可能性があります。キャッシュ侵入とは、キャッシュに存在しないデータをリクエストすることを指します。リクエストが頻繁に発生すると、大量の無効なリクエストがデータベースやその他のバックエンド サービスに直接アクセスすることになり、システムのパフォーマンスに影響を与えます。

キャッシュ侵入の問題を解決するために、Redis と Dart 言語を使用してキャッシュ侵入防御機能を開発できます。具体的な実装手順とサンプル コードは次のとおりです。

  1. Dart プロジェクトに Redis ライブラリをインポートします

まず、pubspec.yaml ファイルを使用して Redis ライブラリをインポートします。 Dart プロジェクトでは、以下に示すように:

dependencies:
  redis: ^4.0.0

次に、pub get コマンドを実行して、必要な依存関係を取得します。

  1. Redis サーバーに接続します

次のコードを使用して Redis サーバーに接続します:

import 'package:redis/redis.dart';

Future<void> main() async {
  final redis = await RedisConnection.connect('localhost', 6379);
}

必ず localhost を置き換えてください。 を # に置き換えます。 ##6379 を Redis サーバーの正しいホスト名とポート番号に置き換えます。

    キャッシュ キーの作成
キャッシュの侵入を防ぐ場合、リクエストを表すことができる一意のキャッシュ キーを作成する必要があります。これは、リクエストの主要なパラメータを組み合わせることで実現できます。たとえば、URL

/api/data?id=123 のリクエストの場合、キャッシュ キーとして data_123 を使用できます。

String createCacheKey(String dataType, String id) {
  return '$dataType_$id';
}

    キャッシュ侵入防御機能の実装
RedisとDartを利用してキャッシュ貫通防御機能を実装する例を以下に示します:

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 を使用して、シンプルで効果的なキャッシュ侵入防御機能を開発できます。これにより、システムのパフォーマンスとセキュリティが大幅に向上し、無効なデータベースやバックエンド サービスへのアクセスが回避されます。

以上がRedis と Dart を使用してキャッシュ侵入防御機能を開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。