써먹는 웹개발

[Node.js] redis로 데이터 기억하는 cache aside pattern api 호출 본문

Server/Node.js

[Node.js] redis로 데이터 기억하는 cache aside pattern api 호출

kmhan 2023. 3. 30. 13:59


728x90
반응형

1. 환경설정

.env 파일에 추가

REDIS_HOST=
REDIS_PORT=19882
REDIS_USERNAME=default
REDIS_PASSWORD=

 

2. Redis 연결

const express = require('express');
const dotenv = require('dotenv');
const redis = require('redis');

dotenv.config(); // env 환경변수 파일 가져오기

//* Redis 연결
// redis[s]://[[username][:password]@][host][:port][/db-number]
const redisClient = redis.createClient({
    url : `redis://${process.env.REDIS_USERNAME}:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/0`,
    legacyMode: true, // 반드시 설정!!
});
redisClient.on('connect', () => {
    console.info('Redis connected!');
});
redisClient.on('error', (err) => {
    console.error('Redis Client Error', err);
});
redisClient.connect().then(); // redis v4 연결 (비동기)
const redisCli = redisClient.v4; // 기본 redisClient 객체는 콜백기반인데 v4버전은 프로미스 기반이라 사용

 

3. cache aside pattern의 api 호출 ★

 - redis(캐시 메모리)에 데이터가 있으면 그대로 반환하고 아니면 DB 조회

app.get('/get', async (req, res) => {
    let value = await redisCli.get(req.key); // redis get key를 한다.
    if (value) {
        // 만약 redis(캐시 메모리)에 데이터가 있다면 그대로 반환 -> Cache Hit
        res.send(value);
    } else {
        // 만약 redis(캐시 메모리)에 데이터가 없다면 DB에서 조회 -> Cache Miss
        let data = await sequelize.query('SELECT data FROM tables where id = key');
        await redisCli.set(key, data); // 그리고 그 데이터를 캐시에 저장하고 반환
        res.send(value);
    }
});

 

 

3-2. api 호출 소스 중복 제거

app.get('/get', async (req, res) => {
    let value = await redisCli.get(req.key); // redis get key를 한다.
    if (!value) {
        // 만약 redis(캐시 메모리)에 데이터가 없다면 DB에서 조회 -> Cache Miss
        let data = await sequelize.query('SELECT data FROM tables where id = key');
        await redisCli.set(key, data); // 그리고 그 데이터를 캐시에 저장하고 반환
    }
    res.send(value);
});

 

출처 : https://inpa.tistory.com/entry/REDIS-NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9Cexpress%EC%97%90%EC%84%9C-redis-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%BA%90%EC%8B%B1-%EC%84%B8%EC%85%98-%EC%8A%A4%ED%86%A0%EC%96%B4

728x90
반응형


Comments