NODEJSにおけるREDISを用いた基本サーバ側キャッシュ


キャッシュはキャッシュ、または一時的なストレージの場所にファイルのコピーを格納するプロセスです.
キャッシングは私たちのウェブサイトをより速くすることに役立って、サーバーとデータベースの間のミドルウェアとして行動することによってより速くユーザー質問に応えます.

キャッシュの2種類が一般的です.
1)サーバ側キャッシュは,多くの異なるクライアントに同じ内容を提供するために,高価なデータベース操作を繰り返し行うのを避けるために一般的に使用されます.
2 )クライアント側キャッシュは、ネットワーク上で同じデータを繰り返し転送するのを避けるために使用されます.
今日、我々はREDIS(速い、オープンソース、メモリ、キー値データストア)を使用している基本的なサーバー側キャッシングを学びます.
Redisのインストール
まず、Redisをプロジェクトで使用する前にインストールする必要があります.
RedisをMacでインストールする
brew install redis
brew services start redis
redis-server /usr/local/etc/redis.conf

Redisのインストール
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install redis-server
sudo service redis-server restart
Redisのインストール
sudo apt update
sudo apt install redis-server
sudo nano /etc/redis/redis.conf
ファイルの内部で、監督された指示を見つけます.このディレクティブを使用すると、Redisをサービスとして管理するためのinitシステムを宣言できます.監視付きディレクティブはデフォルトではnoに設定されます.システムのinitシステムを使用しているUbuntuを実行しているので、systemdに変更してください.
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .
そして最後にREDISを再起動します
sudo systemctl restart redis.service
1)プロジェクトフォルダ内でNPM INITを使用してプロジェクトを初期化し、Express Express、RedisおよびNodeフェッチ(残りのクライアントへのリクエストを行うためのJavaScriptのフェッチと同じです).また、devの依存関係としてnodemonをインストールします.
npm init -y
npm install --save express redis
npm install --dev nodemon 
2)プロジェクトフォルダでこのコードをペーストします.JSエクスプレスエクスプレス、ノックスッキーズとREDISと基本的なサーバーを起動します.
const express = require("express");
const app = express();
const redis = require("redis");
const fetch = require("node-fetch");

app.get("/", (req, res) => {
    res.status(200).send("This is homepage!");
})

app.listen(8080, () => {
     console.log("Server started!");
});
3 )デフォルトのREDISポート( 6379 )をパラメータとしてREADISクライアントを作成し、https://api.github.com/usersからデータを取得し、応答としてデータを送信する新しいルート(/post )を作成します.
我々は、サーバーに我々の最初の訪問にこのデータをキャッシュし、その後、すべての訪問でデータがキャッシュに格納されているかどうかをチェックします.それが格納されるならば、我々はキャッシュからレスポンスを送る代わりに、それをフェッチしません.
const express = require("express");
const app = express();
const redis = require("redis");
const fetch = require("node-fetch");

const client = redis.createClient(6379);

app.get("/posts", (req, res) => {
    console.log("fetching data")    // this will tell uswe are fetching data  from api
    fetch(`https://api.github.com/users`,((response)=>{
       const data = response.json();
       client.set("userData",data);   // save data(key,value pair) in redis in form of cache

     res.send({data:data});
   })
})

app.listen(8080, () => {
     console.log("Server started!");
});
ここではクライアントを使用します.REDISでデータを保存する( key , value )を設定します.
4 )我々は今、ミドルウェアを作成し、キャッシュが既に存在するかどうかをチェックするために"/post "ルートに追加します.データがキャッシュに既に存在するならば、我々は直接それを返します、我々は我々のミドルウェアを残して、ルートからそれをフェッチします.
const checkDataInCache = (req,res,next) =>{
  const  data = client.get("userData"); //get data from cache and check if it exists
  if(data !== null){
    res.send({data:data});
  }else{
    next();
  }
}
今私たちはほとんどのコード(最後に与えられた完全なコード)で行われ、今我々はそれをテストします.
最初に「/post」でGETリクエストを送るならば、私たちはログを「フェッチ」と見ますこれはAPIからデータを取得していることを示しています.
しかし、その後のすべての要求では、ログとデータがより速くロードされます.
(コンソールとネットワークによって速度をチェックすることができます).
これはキャッシュの使い方の基本的な表現でした.以下に与えられる完全なコード.
それが助ける望み!
const express = require("express");
const app = express();
const redis = require("redis");
const fetch = require("node-fetch");

const client = redis.createClient(6379);

app.get("/posts",checkDataInCache, (req, res) => {
    console.log("fetching data")    // this will tell us if we are fetching data  from api
    fetch(`https://api.github.com/users`,((response)=>{
       const data = response.json();
       client.set("userData",data);   // save data(key,value pair) in redis in form of cache

     res.send({data:data});
   })
})

const checkDataInCache = (req,res,next) =>{
  const  data = client.get("userData"); //get data from cache and check if it exists
  if(data !== null){
    res.send({data:data});
  }else{
    next();
  }
}
app.listen(8080, () => {
     console.log("Server started!");
});