Menggunakan Redis Untuk Meng-Cache Data Di Server NodeJS Dan ExpressJS - CRUDPRO

Menggunakan Redis Untuk Meng-Cache Data Di Server NodeJS Dan ExpressJS

Apa itu cache?

  • Cache adalah penyimpanan lokal yang digunakan untuk menyimpan data yang sering digunakan.
  • Caching adalah proses menyimpan salinan file dalam cache atau lokasi penyimpanan sementara untuk akses yang lebih cepat.

Apa itu Redis?

  • Redis adalah singkatan dari Remote Dictionary Server.
  • Redis adalah penyimpanan data nilai kunci dalam memori sumber terbuka untuk digunakan sebagai database, cache, perantara pesan, dan antrian.

Instal server Redis.

Langkah 1: Unduh file zip Redis terbaru dari lokasi hub git resmi. Bagi saya, ini adalah Redis-2.4.5-win32-win64.zip.

Langkah 2: Ekstrak file redis-2.4.5-win32-win64.zip ke lokasi yang diinginkan.

Langkah 3: Berdasarkan sistem operasi Anda, sesuaikan dengan dua folder berbeda. Satu untuk 32-bit dan yang lainnya untuk 64-bit.

Langkah 4: Buka 64-bit dan Anda akan menemukan file-file berikut:

Langkah 5: Klik dua kali pada file redis-server.exe dan Anda akan melihat server Redis mulai dan Anda dapat menunggu untuk terhubung ke client seperti di bawah ini.

Langkah 6: Buka file Redis-cli.exe dan sambungkan ke antarmuka baris perintah Redis.

Ini bertindak sebagai client Redis, jadi segera setelah Anda membuka CLI ini, Anda akan melihat pesan koneksi client di server Redis Anda, seperti yang ditunjukkan di bawah ini.

Setelah Anda menginstal Redis, ada dua cara untuk menggunakan Redis:

  1. Instal Redis-CLI.
  2. Gunakan Redis di aplikasi server Anda.

Langkah 1: Buat BasicExpressServer dan instal paketnya.

    let express = require('express');
    
    var app = express();
    
    app.get('/', (req, res) => {
      res.send('<h1>Hello Welcome to Redis Cache </h1>');
    });
    
    app.listen(3000, () => {
      console.log('server is live on port 3000');
    });
    
  • Setelah server Express Anda dibuat, instal paket npm bernama "Axios" dan kirim permintaan Anda ke API pihak ketiga. Impor.
  • npm install axios --save
    
  • Kemudian buat rute untuk menangani metode GET dengan jalur "/starwar".
  • Parameter pengguna diteruskan saat mengakses jalur untuk mengambil data dari pihak ketiga menggunakan paket Axios.
  • const { default: axios } = require('axios');
    let express = require('express');
    
    var starwarsURL = 'https://swapi.dev/api/';
    
    var app = express();
    
    app.get('/', (req, res) => {
      res.send('<h1>Hello Welcome to Redis Cache </h1>');
    });
    
    app.get('/starwars/:search', async (req, res) => {
      let search = req.params.search;
    
      let data = await axios(starwarsURL + search);
    
      res.json({ data: data.data, info: 'data from 3rd party API' });
    });
    
    app.listen(3000, () => {
      console.log('server is live on port 3000');
    });
    

Langkah 2 Gunakan Redis untuk menyimpan data.

  • Instal paket Redisnpm.
  • npm i redis --save
    
  • Pertama, Anda perlu mengimpor paket redisnpm.
  • Paket Redis menyediakan metode createClient() yang menerima nomor port server Redis yang default ke 6379.
  • Jika Anda mendapatkan kesalahan, Anda bisa menggunakan client.on("error", () => {}). Middleware yang mencatat pesan kesalahan.
  • Saat memproses rute "/starwars", Anda perlu men-cache data yang diterima di Redis menggunakan metode client.setex().
  • const { default: axios } = require('axios');
      let express = require('express');
    
    //importing redis
    
    let redis = require('redis');
    
    var starwarsURL = 'https://swapi.dev/api/';
    
    var app = express();
    
    //using redis.createClient() method
    
    let client = redis.createClient(6379);
    
    //logging if any error
    
    client.on('error', (err) => {
      console.log(err);
    });
    
    app.get('/', (req, res) => {
      res.send('<h1>Hello Welcome to Redis Cache </h1>');
    });
    
    app.get('/starwars/:search', async (req, res) => {
      let search = req.params.search;
    
      let data = await axios(starwarsURL + search);
    
      //caching received data using redis
    
      client.setex(search, 600, JSON.stringify(data.data));
    
      res.json({ data: data.data, info: 'data from 3rd party API' });
    });
    
    app.listen(3000, () => {
      console.log('server is live on port 3000');
    });
    

Langkah 3 Tambahkan middleware dan periksa apakah data ada di cache.

  • Selanjutnya, Anda perlu membuat middleware bernama checkCache. Middleware ini dapat mengakses req, res, dan next.
  • Di middleware samping, Anda dapat menggunakan metode client.get() untuk memeriksa apakah data yang diperlukan ada dalam cache.
  • Metode client.get() menerima string sebagai parameter pertama dan memanggil kembali fungsi sebagai parameter kedua.
  • Anda dapat memberikan nama kunci yang perlu dicari di cache sebagai parameter pertama.
  • Terakhir, kita perlu menambahkan middleware ini ke route handler.
  • var app = express();
    
    //using redis.createClient() method
    
    let client = redis.createClient(6379);
    
    //logging if any error
    
    client.on('error', (err) => {
      console.log(err);
    });
    
    app.get('/', (req, res) => {
      res.send('<h1>Hello Welcome to Redis Cache </h1>');
    });
    
    //middleware to check data is present in cache
    
    var checkCache = (req, res, next) => {
      let search = req.params.search;
      client.get(search, (err, data) => {
        if (err) throw err;
        if (!data) {
          return next();
        } else {
          return res.json({ data: JSON.parse(data), info: 'data from cache' });
        }
      });
    };
    
    app.get('/starwars/:search', checkCache, async (req, res) => {
      let search = req.params.search;
    
      let data = await axios(starwarsURL + search);
    
      //caching received data using redis
    
      client.setex(search, 600, JSON.stringify(data.data));
    
      res.json({ data: data.data, info: 'data from 3rd party API' });
    });
    
    app.listen(3000, () => {
      console.log('server is live on port 3000');
    });