Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

RedisでNext.jsアプリケーションをスピードアップ

Next.jsは、サーバー側のレンダリングと静的サイトの生成を統合する非常に成功したWebフレームワークです。 SSGはCDNキャッシングのおかげでWebサイトを高速化し、SSRはSEOと動的データを支援します。

サーバーサイドレンダリングは、フルスタックアプリケーションの作成に役立つ優れた機能です。ただし、注意しないと、Next.jsWebサイトのパフォーマンスに簡単に影響を与える可能性があります。このブログ投稿では、Redisを活用してNext.jsAPI呼び出しを高速化する方法について説明します。その前に、パフォーマンスを向上させるためのより簡単な方法について簡単に説明します。

API呼び出しでSWRを使用する

SWRは、非常にスマートなデータフェッチライブラリです。 HTTP RFC 5861で説明されているHTTPキャッシュ無効化戦略(stale-while-revalidate)を使用します。SWRを使用してAPIを呼び出すと、キャッシュされたデータが即座に返されますが、非同期で現在のデータがフェッチされ、UIが更新されます。古さに対する許容度に応じて、refreshIntervalを設定することもできます。

const { data: user } = useSWR('/api/user', { refreshInterval: 2000 })

上記のコードでは、ユーザーAPIは2秒ごとに更新されます。

Redisを使用したキャッシング

SWRは非常にシンプルで効果的です。ただし、サーバー側のキャッシュが必要になる場合があります:

  • クライアント側のキャッシュにより、クライアントのパフォーマンスが向上します。ただし、クライアントの数が多いと、サーバー側のリソースに高い負荷がかかる可能性があり、最終的にはクライアント側のパフォーマンスにも影響します。
  • クォータを使用して外部APIを使用している場合は、サーバー側でAPIの使用を制御する必要があります。そうしないと、あまりにも多くのクライアントがAPIをすぐに消費してしまいます。
  • 動的入力を使用してサーバー側でリソースを計算、フェッチ、または処理する場合、クライアント側のキャッシュはあまり役に立ちません。

プロジェクト例:Covid Tracker

このプロジェクトでは、ハビエルアビレスのCovid APIを使用して、症例数が最も多い上位10か国を見つけます。ウェブサイトとソースコードを確認してください。

Redisを使用してCovidAPIからの応答をキャッシュするので:

  • 応答がはるかに速くなります。ウェブサイトを確認すると、Covid APIの呼び出しは数百ミリ秒であり、Redisからのフェッチは1〜2ミリ秒であることがわかります。
  • リクエストが多すぎてCovidAPIを圧倒することはありません。

APIコード

コードは最初に、APIの結果がRedisにキャッシュされているかどうかを確認します。そうでない場合は、Covid APIからすべての国のリストを取得し、当日のケース数で並べ替えて、上位10件をRedisに保存します。 Redisに保存するときに、「EX」60パラメータを設定します。これは、Redisが60秒でエントリを削除することを意味します。

import Redis from "ioredis";

let redis = new Redis(process.env.REDIS_URL);

export default async (req, res) => {
  let start = Date.now();
  let cache = await redis.get("cache");
  cache = JSON.parse(cache);
  let result = {};
  if (cache) {
    console.log("loading from cache");
    result.data = cache;
    result.type = "redis";
    result.latency = Date.now() - start;
    return res.status(200).json(result);
  } else {
    console.log("loading from api");
    start = Date.now();
    return fetch("https://coronavirus-19-api.herokuapp.com/countries")
      .then((r) => r.json())
      .then((data) => {
        data.sort(function (a, b) {
          return b.todayCases - a.todayCases;
        });
        result.data = data.splice(1, 11);
        result.type = "api";
        result.latency = Date.now() - start;
        redis.set("cache", JSON.stringify(result.data), "EX", 60);
        return res.status(200).json(result);
      });
  }
};

UIコード

UIは単純なReactコードです。 SWRを使用してAPIからデータを取得します。

export default function Home() {
  function refresh(e) {
    e.preventDefault();
    window.location.reload();
  }
  const { data, error } = useSWR("api/data", fetcher);
  if (error) return "An error has occurred.";
  if (!data) return "Loading...";
  return (
    <div className={styles.container}>
      <Head>
        <title>Covid Tracker</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>

      <main className={styles.main}>
        <h1 className={styles.title}>Covid Tracker</h1>

        <p className={styles.description}>
          Top 10 countries with the most cases today
        </p>

        <div className={styles.grid}>
          <div className={styles.card} onClick={refresh}>
            <table className={styles.table}>
              <thead>
                <tr>
                  <th>Country</th>
                  <th>Today Cases</th>
                  <th>Today Deaths</th>
                </tr>
              </thead>
              <tbody>
                {data.data.map((item) => (
                  <tr>
                    <td>{item.country}</td>
                    <td>{item.todayCases}</td>
                    <td>{item.todayDeaths}</td>
                  </tr>
                ))}
              </tbody>
            </table>
            <br />
            <em>
              Loaded from {data.type} in <b>{data.latency}</b> milliseconds.
              Click to reload.
            </em>
          </div>
        </div>
      </main>

      <footer className={styles.footer}>
        This is a sample project for the blogpost &nbsp;
        <a
          href="https://blog.upstash.com/nextjs-caching-with-redis"
          target="_blank"
          rel="noopener noreferrer"
        >
          Speed up your Next.js application using Serverless Redis for caching.
        </a>
      </footer>
    </div>
  );
}
外部リンク

https://swr.vercel.app/docs/with-nextjs

https://brianlovin.com/writing/caching-api-routes-with-next-js

https://coronavirus-19-api.herokuapp.com/countries

https://github.com/javieraviles/covidAPI


  1. CloudflareワーカーとのRedis@Edge

    エッジでのコンピューティングは、近年最もエキサイティングな機能の1つです。 CDNを使用すると、ファイルをユーザーに近づけることができます。エッジコンピューティングを使用すると、アプリケーションをユーザーの近くで実行できます。これは、開発者がグローバルに分散されたパフォーマンスの高いアプリケーションを構築するのに役立ちます。 Cloudflare Workersは、現在この分野の主要製品です。コールドスタートのないサーバーレス処理環境を提供します。 Cloudflareのグローバルネットワークを活用して、アプリケーションのレイテンシーを最小限に抑えます。関数はJavascript、Rust、

  2. MSCONFIG で PC をスピードアップする方法

    これは、私たちの意見では、これまで Windows 用に作成された最高のコマンドです。 MSCONFIG は Windows の過去のバージョンに存在し、Windows 10 にも存在します。これは、この記事を読んでいるうちに理解できる明らかな理由からです。 MSCONFIG で PC をスピードアップする方法を知ってください! MSCONFIG が役立つ理由 MSCONFIG で多くのことを制御できますが、自動的に起動するプログラムを制御するため、MSCONFIG が特に気に入っています。これらは、貴重なメモリを使用しているプログラムでもあります。これにより、コンピューターの読み込みに