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