node.js 에서 Redis 다루기

Ungs·2024년 1월 20일
0

개발일지

목록 보기
1/1

상황

개발하는 과정에서 redis를 다룰일이 생겼는데 관련 redis 관련 모듈 예시가 많지 않아 코드를 남긴다.

로컬 redis에 접근하기 위한 코드

// config/redis
// redis 연결에 필요한 코드

import { createClient } from 'redis';

//* Redis 연결
const redisClient = createClient({ legacyMode: true }); // legacy 모드 반드시 설정 !!
redisClient.on('connect', () => {
  console.info('Redis connected!');
});
redisClient.on('error', (err) => {
  console.error('Redis Client Error', err);
});
redisClient.connect().then(); // redis v4 연결 (비동기)

export const redisCli = redisClient.v4;

redis-session 사용

기존에 express-session경우 서버가 끊기는 경우 로그인 기록등 세션이 끊기는 경우 데이터가 날라가기에 redis를 활용한 session 유지를 통해 로그인 등 데이터를 가지고 있도록 함.

connect-redis 모듈 이용

import express, {
  Application,
  Request,
  json,
  Response,
  urlencoded,
} from 'express';
import morgan from 'morgan';
import cors from 'cors';
import session from 'express-session';
import passport from 'passport';
import passportConfig from './config/passport';
import dotenv from 'dotenv';
import { redisCli } from './config/redis';
import RedisStore from 'connect-redis';

otenv.config();
passportConfig(passport);

const app: Application = express();
const port: number = 3000;

// Other settings
app.use(cors());
app.use(json());
app.use(urlencoded({ extended: false }));

// Passport settings
app.use(
  session({
    secret: process.env.SECRET_KEY!,
    resave: false,
    saveUninitialized: false,
    cookie: {
      httpOnly: true,
      secure: false,
    },
    store: new RedisStore({ client: redisCli, prefix: 'session:' }),
  })
);
app.use(passport.initialize());
app.use(passport.session());

app.use(morgan('dev'));
...

최근 검색목록 및 좋아요 기능 만들기

redis는 Integer값을 허용하지 않고 String값만 허용하므로 주의

최근 검색목록

기존에 설정한 redisCli를 이용하여 로컬 redis에 접근함.

최근 검색 목록의 경우 sorted set을 이용

Data.now()함수를 이용하여 score에 이값을 저장시키면 시간순으로 set에 정렬 된다. 그렇게 상위 몇 개만 가져오기 최근 저장된 순으로 자료륽 ㅏ져온다.

// sorted set 등록
redisCli.zAdd({key}, [
      { score: {score값}, value: {value} },
    ]);

// sorted set 해당하는 key의 value값 가져오기
// 두번째 인수 시작위치, 세번쨰 인수 끝위치(-1입력시 마지막) 
redisCli.zRange({key}, 0, -1); // 저장된 value 다 불러오기

좋아요 기능

좋아요 기능의 경우, 한 유저당 하나의 좋아요만 유지되면 되기 때문에
기존 set 자료형 사용

 redisCli.sAdd({key}, {value}); // key, value 입력하면 등록

 redisCli.sMembers({key}); // key 정보만 입력하면 해당하는 자료 모두 가져옴

import { redisCli } from '../config/redis';

export const setKeyword = async (keyword: string, id: number) => {
  try {
    return await redisCli.zAdd(`Keyword:${id}`, [
      { score: Date.now(), value: keyword },
    ]);
  } catch (err) {
    console.log(err);
  }
};

export const getKeyword = async (id: number) => {
  try {
    return await redisCli.zRange(`Keyword:${id}`, -5, -1);
  } catch (err) {
    console.log(err);
  }
};

export const setLike = async (bookId: number, userId: number) => {
  try {
    return await redisCli.sAdd(`Like:${bookId}`, `${userId}`);
  } catch (err) {
    console.log(err);
  }
};

export const getLike = async (bookId: number) => {
  try {
    return redisCli.sMembers(`Like:${bookId}`);
  } catch (err) {
    console.log(err);
  }
};

프로젝트 깃허브

profile
Hi I'm Ungs

0개의 댓글