ホームページ  >  記事  >  ウェブフロントエンド  >  遅延に終止符を打つ: 高需要システム向けの高度で安全なキャッシュの実装

遅延に終止符を打つ: 高需要システム向けの高度で安全なキャッシュの実装

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-24 02:20:09159ブラウズ

Putting an End to Delays: Implementing Advanced and Secure Caching for High-Demand Systems

導入:

今日の世界では、リクエストに対応するスピードと効率が最も重要です。オンライン ストア、ソーシャル ネットワーク、銀行サービスなどの大規模で高トラフィックのシステムは、大量のデータとユーザーのリクエストに直面しています。この高い需要はサーバーやデータベースに大きな負荷をかけるだけでなく、ユーザー エクスペリエンスにも大きな影響を与える可能性があります。このような場合、キャッシュ システムの実装は、パフォーマンスを向上させ、リソースへの負荷を軽減する効果的な解決策となります。

この記事では、より高速なデータ アクセスのためにハッシュ マップと AVL ツリーを組み合わせて利用する高度なキャッシュ システムの実装について説明します。さらに、データの有効期限管理と自動データ削除、およびセキュリティを強化するための入力検証に TTL (Time to Live) メカニズムを採用しています。このスマートで安全なキャッシュ システムは、大規模プロジェクトの必須要件を満たし、ユーザーのサービス速度と効率を向上させるための強力なソリューションを提供します。

1. TTL を使用した AVL ツリーの実装

データの有効期限を管理するために、TTL フィールドを使用して AVL クラスを拡張します。このフィールドは各データ項目の有効期限を指定し、期限切れのデータを自動的に削除します。

// src/utils/avltree.ts

class AVLNode {
  key: string;
  value: any;
  ttl: number; // Time to live
  height: number;
  left: AVLNode | null;
  right: AVLNode | null;

  constructor(key: string, value: any, ttl: number) {
    this.key = key;
    this.value = value;
    this.ttl = Date.now() + ttl; // Expiry time
    this.height = 1;
    this.left = null;
    this.right = null;
  }

  isExpired(): boolean {
    return Date.now() > this.ttl;
  }
}

export class AVLTree {
  private root: AVLNode | null;

  constructor() {
    this.root = null;
  }

  private getHeight(node: AVLNode | null): number {
    return node ? node.height : 0;
  }

  private updateHeight(node: AVLNode): void {
    node.height = 1 + Math.max(this.getHeight(node.left), this.getHeight(node.right));
  }

  private rotateRight(y: AVLNode): AVLNode {
    const x = y.left!;
    y.left = x.right;
    x.right = y;
    this.updateHeight(y);
    this.updateHeight(x);
    return x;
  }

  private rotateLeft(x: AVLNode): AVLNode {
    const y = x.right!;
    x.right = y.left;
    y.left = x;
    this.updateHeight(x);
    this.updateHeight(y);
    return y;
  }

  private getBalance(node: AVLNode): number {
    return node ? this.getHeight(node.left) - this.getHeight(node.right) : 0;
  }

  insert(key: string, value: any, ttl: number): void {
    this.root = this.insertNode(this.root, key, value, ttl);
  }

  private insertNode(node: AVLNode | null, key: string, value: any, ttl: number): AVLNode {
    if (!node) return new AVLNode(key, value, ttl);

    if (key < node.key) {
      node.left = this.insertNode(node.left, key, value, ttl);
    } else if (key > node.key) {
      node.right = this.insertNode(node.right, key, value, ttl);
    } else {
      node.value = value;
      node.ttl = Date.now() + ttl;
      return node;
    }

    this.updateHeight(node);
    const balance = this.getBalance(node);

    if (balance > 1 && key < node.left!.key) return this.rotateRight(node);
    if (balance < -1 && key > node.right!.key) return this.rotateLeft(node);
    if (balance > 1 && key > node.left!.key) {
      node.left = this.rotateLeft(node.left!);
      return this.rotateRight(node);
    }
    if (balance < -1 && key < node.right!.key) {
      node.right = this.rotateRight(node.right!);
      return this.rotateLeft(node);
    }
    return node;
  }

  search(key: string): any {
    let node = this.root;
    while (node) {
      if (node.isExpired()) {
        this.delete(node.key);
        return null;
      }
      if (key === node.key) return node.value;
      node = key < node.key ? node.left : node.right;
    }
    return null;
  }

  delete(key: string): void {
    this.root = this.deleteNode(this.root, key);
  }

  private deleteNode(node: AVLNode | null, key: string): AVLNode | null {
    if (!node) return null;

    if (key < node.key) {
      node.left = this.deleteNode(node.left, key);
    } else if (key > node.key) {
      node.right = this.deleteNode(node.right, key);
    } else {
      if (!node.left || !node.right) return node.left || node.right;
      let minLargerNode = node.right;
      while (minLargerNode.left) minLargerNode = minLargerNode.left;
      node.key = minLargerNode.key;
      node.value = minLargerNode.value;
      node.ttl = minLargerNode.ttl;
      node.right = this.deleteNode(node.right, minLargerNode.key);
    }
    this.updateHeight(node);
    const balance = this.getBalance(node);

    if (balance > 1 && this.getBalance(node.left!) >= 0) return this.rotateRight(node);
    if (balance < -1 && this.getBalance(node.right!) <= 0) return this.rotateLeft(node);
    if (balance > 1 && this.getBalance(node.left!) < 0) {
      node.left = this.rotateLeft(node.left!);
      return this.rotateRight(node);
    }
    if (balance < -1 && this.getBalance(node.right!) > 0) {
      node.right = this.rotateRight(node.right!);
      return this.rotateLeft(node);
    }
    return node;
  }
}

2. TTLおよびセキュリティメカニズムによる強化されたキャッシュサービス

このサービスは AVLTree クラスを使用してデータを効率的かつ安全に管理します。これには、データ セキュリティのための基本的な検証メカニズムが含まれています。

// src/cache/cache.service.ts

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AVLTree } from '../utils/avltree';

@Injectable()
export class CacheService {
  private avlTree: AVLTree;
  private authorizedTokens: Set<string> = new Set(['your_authorized_token']); // Simple validation example

  constructor() {
    this.avlTree = new AVLTree();
  }

  validateToken(token: string): void {
    if (!this.authorizedTokens.has(token)) {
      throw new UnauthorizedException('Invalid access token');
    }
  }

  set(key: string, value: any, ttl: number, token: string): void {
    this.validateToken(token);
    this.avlTree.insert(key, value, ttl);
  }

  get(key: string, token: string): any {
    this.validateToken(token);
    return this.avlTree.search(key);
  }

  delete(key: string, token: string): void {
    this.validateToken(token);
    this.avlTree.delete(key);
  }
}

3. 検証とTTLを備えたコントローラー

API コントローラーは、set、get、および delete メソッドを使用して、データを安全に保存および取得します。

// src/cache/cache.controller.ts

import { Controller, Get, Post, Delete, Body, Param, Query } from '@nestjs/common';
import { CacheService } from './cache.service';

@Controller('cache')
export class CacheController {
  constructor(private readonly cacheService: CacheService) {}

  @Post('set')
  setCache(@Body() body: { key: string; value: any; ttl: number; token: string }) {
    this.cacheService.set(body.key, body.value, body.ttl, body.token);
    return { message: 'Data cached successfully' };
  }

  @Get('get/:key')
  getCache(@Param('key') key: string, @Query('token') token: string) {
    const value = this.cacheService.get(key, token);
    return value ? { value } : { message: 'Key not found or expired' };
  }

  @Delete('delete/:key')
  deleteCache(@Param('key') key: string, @Query('token') token: string) {
    this.cacheService.delete(key);
    return { message: 'Key deleted successfully' };
  }
}

キャッシングシステムの実際の使用例

  1. 認証システムのセッション管理:

    例: 銀行および金融システム。

  2. リクエストの負荷を軽減するための API キャッシュ:

    例: 天気アプリや為替ウェブサイト

  3. オンライン プラットフォームでのリアルタイム ユーザー ステータス ストレージ:

    例: WhatsApp や Telegram などのメッセージング アプリ。

  4. オンライン ストアの商品データ ストレージ:

    例: Amazon などのトラフィックの多い電子商取引プラットフォーム

これらの例は、このキャッシュ システムがデータベースとサーバーの負荷を大幅に軽減し、ユーザーの応答時間を短縮できることを示しています。

結論

この記事では、AVL ツリーとハッシュ マップを組み合わせた高度なキャッシュ システムを設計して実装し、高速なデータ アクセスとサーバー パフォーマンスの最適化を可能にしました。 TTL メカニズムは自動データ有効期限管理を提供し、トークン検証により適切なセキュリティが確保されます。

このインテリジェントなキャッシュ システムは効率的かつ柔軟で、動的で機密データを含む大規模なアプリケーションに適しており、分散アーキテクチャでのスケーラブルな要件をサポートします。

以上が遅延に終止符を打つ: 高需要システム向けの高度で安全なキャッシュの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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