Tag Archives: axios

Redis cache ve axios örneği

Redis ANSI C ile yazılmış açık kaynak kodlu bir veri yapısı tutucusudur(data structure store). Database, cache veya publish/subscribe mesajlaşmada broker olarak kullanılabilir. Pratikte cache olarak kullanımı daha yaygındır. Cache olarak kullanımda ilişkisel veritabanından farklı olarak veriyi diskte tutmak yerine ana bellekte tutar. Sorgu RAM sonucu RAM üzerinden gelir(in-memory).

Docker ile redis kurulumu – redis default port: 6379

docker run --name redisserver -p 6379:6379 -d redis

Axios ile spesifik bir ip adresinin bilgilerini getiren apiye request atacağız. İlk request atıldığında redis devreye girecek ve ilk datayı key, value şeklinde belirtilen zaman dilimi süresince memory’de saklayacak. Sonraki aynı atılan requestlerde request atılmadan önce cache içerisinde varsa veriyi cache içerisinden getirecek. Eğer yoksa resource api çağrımı yapacak. Bu yöntem ile 300ms süreyi 15ms-20ms arasına çekmek mümkün oldu.

npm install redis axios

Request/Response caching: client.setEx ile 60 saniyeliğine datayı cache ediyoruz

const REDIS_PORT = process.env.REDIS_PORT || 6379;
const client = redis.createClient(REDIS_PORT);

router.get('/ipInfo', cache, (req, res) => {

  const { ipAddress } = req.query;
  let url = `https://iplist.cc/api/${ipAddress}`;

  axios.get(url)
  .then(function (response) {

    if(response.status == 200){
      //key, second, payload data
      let dd = JSON.stringify(response.data);
      client.setex(ipAddress, 60, dd);
      return res.json(response.data);
    }
    res.send('Fail');

  })
  .catch(function (error) {
    return res.json({
      err: error
    });
  })

});

Cache middleware

function cache(req, res, next) {
  const { ipAddress } = req.query;

  client.get(ipAddress, (err, data) => {
    if (err) throw err;

    if (data !== null) {
      console.log('redis cache');
      res.json(JSON.parse(data));
    } else {
      next();
    }

  });
}

Request/Response ölçümü

curl-format.txt

DNS lookup, TCP bağlantısı, varsa redirect, veri iletimi gibi işlerin ölçümü için format dosyası

time_namelookup: %{time_namelookup}
time_connect: %{time_connect}
time_appconnect: %{time_appconnect}
time_pretransfer: %{time_pretransfer}
time_redirect: %{time_redirect}
time_starttransfer: %{time_starttransfer}
———
time_total: %{time_total}

CURL Komutu

curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/user/ipInfo?i pAddress=52.178.167.109

Cache öncesi

time_namelookup: 0.015000
time_connect: 0.015000
time_appconnect: 0.000000
time_pretransfer: 0.015000
time_redirect: 0.000000
time_starttransfer: 0.250000
———
time_total: 0.250000

Cache sonrası

time_namelookup: 0.000001
time_connect: 0.000001
time_appconnect: 0.000000
time_pretransfer: 0.000001
time_redirect: 0.000000
time_starttransfer: 0.015000
———
time_total: 0.015000

250ms den cache ile response süresi 15 ms oldu.

Redis bu örnekte remote bir API ye bağlandı fakat uzun süren ilişkisel db sorgularıda bu şekilde cache edilebilir

https://github.com/eroltutumlu/node-auth/blob/master/routes/user.js