개발하는 과정에서 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;
기존에 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);
}
};