ホームページ >ウェブフロントエンド >jsチュートリアル >RedisでMongoDBデータベースをキャッシュします

RedisでMongoDBデータベースをキャッシュします

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-19 13:00:15967ブラウズ

このチュートリアルは、Redisキャッシングレイヤーを実装してMongoDBデータベースと対話するnode.js Webサービスのパフォーマンスを高める方法を示しています。 概念を説明するために、「ファストライブラリ」アプリケーションを構築します

Redisキャッシングの重要な利点:

Redisの高速でメモリ内のストレージに頻繁にアクセスされるデータを保存することにより、読み取りパフォーマンスが大幅に向上します。
    MongoDBデータベースの負荷を削減し、データスケールとしてパフォーマンスのボトルネックを防止します。
  • RedisのLRU(最近使用しなかった)キャッシュ立ち退きポリシーは、メモリの使用量を自動的に管理します。
  • メモリ階層を理解する:
キャッシュは、ストレージ容量と速度の間の固有のトレードオフに対処します。 ハードドライブは大容量ですが、アクセスが遅くなりますが、RAMはより高速ですが小さくなります。 CPUレジスタは最速ですが、容量は最小限です。 キャッシュは高速仲介業者として機能し、頻繁にアクセスされるデータをより高速なメモリ(RAMなど)に保存します。 以下の図は、これを示しています:

「fastLibrary」アプリケーションの構築:

Caching a MongoDB Database with Redis

2つのエンドポイントを備えたシンプルなWebサービスを作成します:

:Mongodbに新しい本のエントリを作成します

:タイトルごとに本の内容を取得します。
  • POST /book
  • ステップ1:プロジェクトのセットアップ:
  • GET /book/:title
  • プロジェクトディレクトリを作成し、npm:

を初期化します 依存関係のインストール:

  1. mkdir fastLibrary && cd fastLibrary && npm initステップ2:基本的なmongoDB相互作用:
  2. npm install express mongodb redis --save
  3. モジュールはデータベース操作を処理します:

ファイルはExpressサーバーをセットアップし、MongoDBに接続します:

access.js

ステップ3:Redisキャッシングの統合:
<code class="language-javascript">module.exports.saveBook = (db, title, author, text, callback) => {
    db.collection('text').save({ title, author, text }, callback);
};

module.exports.findBookByTitle = (db, title, callback) => {
    db.collection('text').findOne({ title }, (err, doc) => {
        if (err || !doc) callback(null);
        else callback(doc.text);
    });
};</code>

index.js

<code class="language-javascript">// ... (require statements and MongoDB connection as before) ...

app.post('/book', (req, res) => {
    // ... (save book logic as before) ...
});

app.get('/book/:title', (req, res) => {
    // ... (get book logic, updated later with caching) ...
});

// ... (app.listen as before) ...</code>

でRedisクライアントを初期化します

  1. を変更して、index.js
  2. を追加します
<code class="language-javascript">const redis = require('redis').createClient({ url: 'redis://localhost:6379' });
redis.connect().catch(console.error);</code>
  1. access.jsfindBookByTitleCachedエンドポイントを更新して、
を使用します
<code class="language-javascript">module.exports.findBookByTitleCached = (db, redis, title, callback) => {
    redis.get(title, (err, reply) => {
        if (err) callback(null);
        else if (reply) callback(JSON.parse(reply)); // Cache hit
        else { // Cache miss
            db.collection('text').findOne({ title }, (err, doc) => {
                if (err || !doc) callback(null);
                else {
                    redis.set(title, JSON.stringify(doc)); // Add to cache
                    callback(doc.text);
                }
            });
        }
    });
};</code>
  1. GET /book/:titleステップ4:Redis LRUの構成:index.js findBookByTitleCached LRUが有効になり、メモリ制限(必要に応じて調整)でRedisを開始します:
<code class="language-javascript">app.get('/book/:title', (req, res) => {
    access.findBookByTitleCached(db, redis, req.params.title, (book) => {
        if (!book) res.status(404).send('Book not found');
        else res.send(book);
    });
});</code>

ステップ5:キャッシュの更新の処理(エンドポイントのパット):

エンドポイントを追加して書籍を更新し、それに応じてキャッシュを更新します。 これには、

関数を

に、
<code class="language-bash">redis-server --maxmemory 512mb --maxmemory-policy allkeys-lru</code>
エンドポイントに

に追加する必要があります。 (実装の詳細は簡潔に省略されていますが、上記のキャッシュロジックと同様)。

パフォーマンスのテストと結論:

キャッシュを実装した後、キャッシュなしのパフォーマンスメトリック(応答時間)を比較して、改善を観察します。 早期最適化は有害である可能性があることを忘れないでください。そのため、キャッシュが必要かつ適切であるかどうかを慎重に評価してください。 読み取り/書き込み比率、クエリの複雑さ、データの一貫性要件などの要因を考慮してください。 提供されたFAQは、これらの考慮事項に関する追加の洞察を提供します

以上がRedisでMongoDBデータベースをキャッシュしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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