Rumah  >  Artikel  >  pangkalan data  >  Cara menggunakan Redis dan Dart untuk membangunkan fungsi pertahanan penembusan cache

Cara menggunakan Redis dan Dart untuk membangunkan fungsi pertahanan penembusan cache

WBOY
WBOYasal
2023-09-22 08:12:251041semak imbas

Cara menggunakan Redis dan Dart untuk membangunkan fungsi pertahanan penembusan cache

Cara membangunkan fungsi pertahanan penembusan cache menggunakan Redis dan Dart

Dalam aplikasi web moden, caching ialah teknologi pengoptimuman prestasi biasa. Walau bagaimanapun, sistem caching mungkin terdedah kepada serangan penembusan cache. Penembusan cache merujuk kepada permintaan data yang tidak wujud dalam cache Apabila permintaan kerap, ia akan menyebabkan sejumlah besar permintaan tidak sah untuk mengakses terus pangkalan data atau perkhidmatan back-end lain, sekali gus menjejaskan prestasi sistem.

Untuk menyelesaikan masalah penembusan cache, kita boleh menggunakan bahasa Redis dan Dart untuk membangunkan fungsi pertahanan penembusan cache. Berikut ialah langkah pelaksanaan khusus dan kod sampel:

  1. Import pustaka Redis dalam projek Dart

Mula-mula, gunakan fail pubspec.yaml untuk mengimport perpustakaan redis dalam projek Dart, seperti yang ditunjukkan di bawah:

dependencies:
  redis: ^4.0.0

Kemudian, jalankan perintah pub get untuk mendapatkan kebergantungan yang diperlukan. pub get命令以获取所需的依赖项。

  1. 连接到Redis服务器

使用下面的代码连接到Redis服务器:

import 'package:redis/redis.dart';

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

请确保将localhost6379替换为您的Redis服务器的正确主机名和端口号。

  1. 创建缓存键

在防御缓存穿透时,我们需要创建一个能够表示请求的唯一缓存键。这可以通过组合请求的关键参数来实现。例如,对于URL为/api/data?id=123的请求,我们可以使用data_123作为缓存键。

String createCacheKey(String dataType, String id) {
  return '$dataType_$id';
}
  1. 缓存穿透防御功能实现

以下是一个使用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');
}

在上面的示例中,我们首先通过创建Cache类来封装与Redis的交互。然后,通过创建DataService类来实现数据的获取逻辑。在getData

    Sambung ke pelayan Redis

    🎜Gunakan kod berikut untuk menyambung ke pelayan Redis: 🎜rrreee🎜Sila pastikan untuk menggantikan localhost dan 6379 kod> Nama hos dan nombor port yang betul untuk pelayan Redis anda. 🎜<ol start="3">🎜Buat kunci cache🎜🎜🎜Apabila mempertahankan daripada penembusan cache, kita perlu mencipta kunci cache unik yang mewakili permintaan. Ini boleh dicapai dengan menggabungkan parameter utama permintaan. Contohnya, untuk permintaan dengan URL <code>/api/data?id=123, kita boleh menggunakan data_123 sebagai kunci cache. 🎜rrreee
      🎜Pelaksanaan fungsi pertahanan penembusan cache🎜🎜🎜Berikut ialah contoh penggunaan Redis dan Dart untuk melaksanakan fungsi pertahanan penembusan cache: 🎜rrreee🎜Dalam contoh di atas, kami mula-mula mencipta Cache
kelas untuk merangkum interaksi dengan Redis. Kemudian, laksanakan logik pemerolehan data dengan mencipta kelas DataService. Dalam kaedah getData, kami mula-mula cuba mendapatkan data yang diminta daripada cache, jika data tidak wujud, kami mendapatkan data daripada perkhidmatan backend dan menyimpan hasilnya dalam cache. 🎜🎜Melalui langkah dan kod sampel di atas, kami boleh menggunakan Redis dan Dart untuk membangunkan fungsi pertahanan penembusan cache yang mudah dan berkesan. Ini akan meningkatkan prestasi dan keselamatan sistem dengan banyak serta mengelakkan pangkalan data tidak sah atau akses perkhidmatan bahagian belakang. 🎜

Atas ialah kandungan terperinci Cara menggunakan Redis dan Dart untuk membangunkan fungsi pertahanan penembusan cache. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn