บทความนี้ให้ตัวอย่างแอปพลิเคชันที่ใช้ Redis Cache พร้อมคำอธิบาย
ดูบทความเกี่ยวกับการสร้าง Express Node JS application เพื่อที่เราจะข้ามไปที่หัวข้อหลักได้ทันที
ทำไมต้องมี Caching?
เมื่อต้องการส่ง response เดียวกันหลายครั้ง ให้เก็บข้อมูลใน distributed server memory เพื่อดึงได้เร็วกว่าการดึงจาก storage layer ทุกครั้ง Caching คือความสามารถของแอปพลิเคชันในการ duplicate ค่าสำหรับระยะเวลาที่กำหนด และบริการ web request ทันที
เทคนิคเหล่านี้มีประสิทธิภาพเมื่อ:
- ต้องเรียก 3rd party API และนับจำนวนการเรียก (call counts)
- ต้นทุนการถ่ายโอนข้อมูลระหว่าง cloud และ server
- Server response สำคัญขึ้นอยู่กับ concurrent requests
Redis Cache คืออะไร?
Data cache ที่เก็บใน centralized distributed system เช่น Redis Redis เรียกได้ว่า data structures server หมายถึง กระบวนการหลายอย่างสามารถ query และ modify ข้อมูลพร้อมกันได้โดยไม่มี loading time มาก
ข้อดีของ Redis
คุณสมบัติพิเศษของโครงสร้างข้อมูล:
- แม้ข้อมูลจะถูกร้องขอ บริการ และแก้ไขบ่อย ข้อมูลจะถูกเก็บใน disk แทนที่จะเก็บใน RAM
- ไม่เหมือน high-level programming language การนำไปใช้จะเน้น memory optimal usage
- เสนอ features เช่น replication, ระดับ durability, clustering และ high availability (HA)
- Redis จัดการ complex Memcached operations ได้ เช่น Lists, Sets, ordered data set ฯลฯ
ใช้ Redis Client ในระบบท้องถิ่น
เพื่อใช้ Redis ต้องติดตั้ง Node JS Redis Client ในระบบท้องถิ่น ไฟล์ msi (v3.0.504 stable version ณ วันที่เผยแพร่) ดาวน์โหลดจาก Github และติดตั้งปกติ (สำหรับ Windows OS)
Redis Client ล่าสุด สามารถติดตั้งด้วย Windows Subsystem for Linux (WSL) และติดตั้ง Redis 6.x versions สำหรับ dockerizing, Mac และ Linux OS ตามคำแนะนำใน downloads
รัน Redis Client ด้วยคำสั่ง:
redis-server

สร้าง Express Node JS Application
เปิด PowerShell หรือ cmd prompt ไปที่โฟลเดอร์ปลายทาง
รันคำสั่ง:
npx express expressRedisCaching –hbs

ติดตั้ง modules:
npm i
และติดตั้งแพ็กเกจเพิ่มเติม:
npm i redis
npm i isomorphic-fetch
เมื่อแพ็กเกจติดตั้งเสร็จและพร้อมเริ่ม ผมสร้าง route page ใหม่ชื่อ "getCached.js" และ map ใน "App.js"
app.use('/getCached', require('./routes/getCached'));
เมื่อเรียก endpoint logic คือ fetch response จาก JSON placeholder (mock API) site เก็บข้อมูลใน Redis Cache และตอบสนอง request ใน request ถัดไป จะ serve ข้อมูลจาก cache
const express = require('express')
require('isomorphic-fetch')
const redis = require('redis')
const router = express.Router()
const client = redis.createClient({ host:'127.0.0.1', port:6379 })
let sourceURL = 'https://jsonplaceholder.typicode.com/todos';
router.get('/',async(req, res)=>{
await client.connect();
const value = await client.get('todos');
if(value){
console.log("from cached data")
res.send(JSON.parse(value))
} else{
const resp = await fetch(sourceURL)
.then((response) => response.json());
await client.set('todos', JSON.stringify(resp));
console.log("from source data")
res.send(resp);
}
await client.disconnect();
})
module.exports = router
Object ที่สร้างด้วย redis:
redis.createClient({ host:'127.0.0.1', port:6379});
พร้อม options:
host: ปัจจุบัน Redis อยู่ในระบบท้องถิ่น host default 127.0.0.1
port: default Windows OS จะจัดสรร port 6379 ให้ Redis แต่สามารถปรับแต่งได้
ตอนนี้รัน app ด้วยคำสั่ง:
npm start


ครั้งแรก hit: ดึงข้อมูลจาก source API response time ~1156ms เก็บใน Redis Cache ครั้งที่สอง: ดึงจาก cache fetch time ลดเหลือ ~10ms หรือ ~6ms
ดังนั้น วัตถุประสงค์บรรลุได้ด้วยขั้นตอนง่ายๆ