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:
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
命令以获取所需的依赖项。
使用下面的代码连接到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'); }
在上面的示例中,我们首先通过创建Cache
类来封装与Redis的交互。然后,通过创建DataService
类来实现数据的获取逻辑。在getData
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. 🎜rrreeeDataService
. 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!