일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 코드트리
- 최적화
- redis설계
- Java
- 재귀
- c++
- 소프트딜리트
- Baekjoon
- 완전탐색
- C
- 백엔드개발
- 코딩
- 코딩테스트
- harddelte
- nestjscli
- 코드생성
- 자동파일생성
- SoftDelete
- redis키네이밍
- 알고리즘
- 캐시전략
- 조합알고리즘
- 코드트리조별과제
- 분할정복
- 자바
- 순열알고리즘
- 입출력
- 자료구조
- typescripte
- 백준
- Today
- Total
Behind.dev
[Redis] Redis Key 네임스페이스 설계로 효율적인 데이터 관리 본문
▤ 목차
Redis Key 네임스페이스 설계로 효율적인 데이터 관리
서비스를 운영하면서 Redis를 도입해 캐시, 인증 코드 저장, 통계 등 다양한 목적에 활용하게 되었습니다. 처음에는 단순히 set(key, value) 구조로 데이터를 넣고 쓰기만 하였지만, 키가 점점 많아지고 목적이 섞이기 시작하면서 혼란이 생겼습니다.
예를 들어 인증 코드도 저장하고, 상품 캐시도 저장하고, 주문 처리 관련 상태도 저장하다 보니
- 이 키는 무슨 용도였지?
- 이 값을 지우면 다른 기능에 영향은 없을까?
- 특정 기능 관련된 키만 지우고 싶은데, 어떻게 한 번에 지우지?
이러한 고민들이 반복되면서, Redis 키를 기능별로 명확하게 “구분”할 수 있는 구조가 필요하다고 느꼈습니다.
그래서 도입하게 된 방식이 바로 key 네임스페이스(Prefix) 설계입니다.
왜 Redis 키를 구분해서 써야 할까?
Redis는 내부적으로 모든 key를 평평한 공간(flat namespace)에 저장합니다. 즉, 기능이 완전히 다른 값들도 key 이름만 다르면 갚은 공간에 들어가게 됩니다. 이럴 때 접두사(prefix)를 붙여서 논리적으로 그룹화하면 아래와 같은 장점이 있습니다.
목적 설명
기능별로 분리 | 인증, 주문, 통계, 캐시 등 기능 구분 |
충돌 방지 | 같은 ID라도 용도별로 겹치지 않게 |
유지보수 용이 | 어떤 key가 어디서 쓰이는지 파악 쉬움 |
일괄 삭제/검색 가능 | DEL status:*a , KEY email-code 등 |
GUI에서 보기 편함 | Redislnsight 같은 도구에서 필터로 확인 가능 |
키 네임스테이스 구조 예시
형식은 다음과 같이 간단합니다.
[도메인 또는 기능]:[세부기능]:[식별자]
예시 표는 아래와 같습니다:
Redis Key | 설명 |
auth:code:email:someone@example.com | 이메일 인증 코드 저장 |
auth:code:phone:01012345678 | 휴대폰 인증 코드 저장 |
product:cache:12345 | 상품 ID 12345에 대한 캐시 데이터 |
order:status:98765 | 주문 ID 98765의 처리 상태 저장 |
user:session:abcd1234 | 사용자 세션 토큰 저장 |
➡️ 이처럼 키를 잘 나누어 설계하면 Redislnsight 같은 GUI 툴에서 트리 구조로 구분되어 필요한 키만 빠르게 찾거나 TTL 등을 시각적으로 확인할 수 있습니다.
실제 코드 예시 (TypeScript)
TypeScript와 ioredis를 사용하는 경우 다음과 같이 구현할 수 있습니다:
import { Redis } from 'ioredis';
const redis = new Redis();
// 이메일 인증 코드 저장
const saveEmailCode = asyce (email: string, code: string) => {
code key = `auth:code:email:${email}`;
await redis.set(key, code, 'EX', 300); // 5분 TTL
}
// 상품 캐시 저장
const cacheProduct = async (productId: string, data: string) => {
const key = `product:cache:${productId}`;
await redis.set(key, data, 'EX', 3600); // 1시간 TTL
};
// 주문 상태 조회
const getOrderStatus = async (orderId: string) => {
const key = `order:status:${orderId}`;
return await redis.get(key);
};
유용한 Redis 명령어
명령어 | 설명 |
KEYS auth:code:* | 이메일/휴대폰 인증 코드 전체 검색 (개발 환경에서만 권장) |
SCAN 0 MATCH product:cache:* COUNT 100 | 상품 캐시 키를 페이징 검색 |
DEL user:session:abcd1234 | 특정 세션 키 삭제 |
TTL auth:code:email:someone@example.com | 인증 코드의 남은 유효 시간 확인 |
EXPIRE order:status:98765 600 | 주문 상태 키에 TTL 추가 설정 |
💬 마무리하며
처음에는 단순하게 생각했던 Redis 키 네이밍이었지만,
서비스가 커지고 데이터가 많아질수록 관리성과 유지보수성에서 큰 차이를 만들었습니다.
Redis를 사용할 때 단순히 key를 만드는 것에 그 치치 않고,
“이 키는 어떤 기능을 위한 것이며, 어떻게 그룹화해 관리할 수 있을까?”
라는 고민을 함께 한다면, 더 안정적이고 체계적인 Redis활용이 가능할 것이라고 생각합니다!