[サーバパフォーマンス向上ストレージ2]キャッシュとRedisの理解


通常、要求応答時にデータベースにアクセスするのに最も時間がかかります.そして現在進行中のプロジェクトはWEB-WAS-DBの三層構造です.ユーザーの増加がデータベースに影響を及ぼすことを防止するために、キャッシュを使用してサーバのパフォーマンスを改善しようとしました.

Cache

  • キャッシュとは、データまたは値が予めコピーされた一時的な場所を指す.
  • キャッシュは、通常メモリが使用されるため、かなり高速です.
  • データを
  • キャッシュにプリコピーし、計算やアクセス時間を必要とせずにデータに迅速にアクセスします.
  • 、すなわち、結果は予め保存され、その後、要求が受信されると、データベースにアクセスせず、要求はキャッシュに処理される.
  • という有用なキャッシュにも欠点があるそうです.キャッシュ・サーバは主にメモリを使用して高速化されるため、サーバに障害が発生するとメモリが失われ、データが失われる可能性があります.したがって、ディスクがディスクを使用するように構成されたり、差別のないキャッシュを使用するように構成されたりすることは避ける必要があります.

    Redis

  • リモート・ディレクトリ・サーバは、「キー値」構造を有する非構造化データを格納および管理するためのオープン・ソース・ベースの非関係型データベース管理システムです.
  • は、全てのデータをメモリにロードして処理するメモリベースのDBMSである.
  • Redisがサポートするデータ構造
  • String
  • List
  • Set
  • Sorted
  • Set
  • Hashes
  • Redis設定


    Redisインストール(Mac)


    RedisはHomebrewを使用してMacにインストールできます.
    brew install redis

    Redis起動


    Redisサーバをローカルで起動するには、次のコマンドを実行します.
    redis-server

    NodeJSプロジェクトの設定


    インストールの依存関係


    redis依存性を設定してredisに接続します.
    npm install redis

    作成したサーバをRedisサーバに接続


    server.js
    const express = require('express');
    const redis = require('redis'); // Redis 모듈 불러오기
    const axios = require('axios');
    const bodyParser = require('body-parser');
    
    const redisClient = redis.createClient();
    // ...
    createClient()メソッドは、RedisサーバとExpressサーバが同じホスト上で実行されている場合、createClient()を設定する必要がない新しいRedisClientオブジェクトを生成します.ホストが異なる場合は、ホストurl、ポート番号などの設定を追加する必要があります.
    //...
    app.get('/photos', async(req, res) => {
        const albumId = req.query.albumId
        const {data} = await axios.get(
            'https://jsonplaceholder.typicode.com/photos',
            {params : {albumId}},
            )
        res.json(data)
    })
    
    //...
    Json apiのウェブサイトをテストしてデータの大きい「/写真」の送信を要求します.
    回答所要時間は0.4秒であった.では、同じリクエストを受信したらキャッシュに戻ります.
    //...
    
    // 캐시 체크를 위한 미들웨어
    checkCache = (req, res, next) => {
        redisClient.get(req.url, (err, data) => {
          if (err) {
            console.log(err);
            res.status(500).send(err);
          }
          // Redis에 저장된게 존재한다.
          if (data != null) {
            res.send(data);
          } else {
            // Redis에 저장된게 없기 때문에 다음 로직 실행
            next();
          }
        });
      };
    
    app.get('/photos', checkCache, async (req, res) => {
        try {
          console.log(req.url)
          const {data} = await axios.get('https://jsonplaceholder.typicode.com/photos');
      
          await redisClient.setex(req.url, 1440, JSON.stringify(data));
      
          return res.json(data);
        } catch (error) {
          console.error(error);
          return res.status(500).json(error);
        }
      });
    
    //...
  • まず、要求が「/写真」である場合、Redisサーバにデータがキャッシュされているかどうかを「checkCache」ミドルウェアで検証する.
  • RedisClientオブジェクトのgetメソッドは、第1のパラメータでキー値を受信し、第2のパラメータでコールバック関数を渡す.
  • の場合は、「/写真」として保存されている値があるかどうかを確認し、キャッシュ値がある場合はデータを表示します.
  • 修正が完了したら、Redisサーバを実行してからリクエストを送信するのを忘れないでください.
    同じ要求が繰り返し送信される場合、応答時間は0.03秒である.最初のリクエストに比べて、進歩が速いことがわかります.
    こうしてRedisでキャッシュを利用したこれらのリソースを活用することで、アプリケーションの速度とパフォーマンスを大幅に向上させることができます.適切なapiに適用した後、サーバ負荷テストを再実行して、より高いパフォーマンスを体験する必要があります.

    リファレンス


    https://redis.io/docs/about/
    https://ko.wikipedia.org/wiki/%EC%BA%90%EC%8B%9C
    https://sabarada.tistory.com/103
    https://brunch.co.kr/@jehovah/20
    https://charming-kyu.tistory.com/37