Tan Kim

Redis

인메모리 키-값 데이터 저장소. 캐시, 세션, 메시지 큐, 분산 락 등에 사용. 기본 포트 6379.

자료구조

타입 설명 사용 사례
String 문자열, 숫자 캐시, 카운터, 세션
List 순서 있는 문자열 목록 큐, 최근 활동 로그
Hash 필드-값 쌍의 맵 객체 저장, 사용자 프로필
Set 중복 없는 문자열 집합 태그, 팔로워 목록
Sorted Set 점수 기반 정렬 집합 랭킹, 우선순위 큐
Stream 시계열 데이터 로그 이벤트 스트림

명령어

String

SET key "value"
SET key "value" EX 3600    # TTL 3600초
GET key
DEL key
EXISTS key
INCR counter               # 1 증가
INCRBY counter 5
EXPIRE key 60              # TTL 설정
TTL key                    # 남은 TTL 확인

Hash

HSET user:1 name "김탄" age 30
HGET user:1 name
HGETALL user:1
HMSET user:1 name "김탄" email "test@example.com"
HDEL user:1 email

List

RPUSH queue "task1"        # 오른쪽 추가
LPUSH queue "task0"        # 왼쪽 추가
LPOP queue                 # 왼쪽 꺼내기 (큐)
RPOP queue                 # 오른쪽 꺼내기 (스택)
LRANGE queue 0 -1          # 전체 조회
LLEN queue
BLPOP queue 10             # 블로킹 POP (최대 10초 대기)

Set

SADD tags "python" "java"
SMEMBERS tags
SISMEMBER tags "python"    # 포함 여부
SCARD tags                 # 개수
SINTER set1 set2           # 교집합
SUNION set1 set2           # 합집합
SDIFF set1 set2            # 차집합

Sorted Set

ZADD leaderboard 1500 "user1"
ZADD leaderboard 2000 "user2"
ZRANGE leaderboard 0 -1 WITHSCORES     # 오름차순
ZREVRANGE leaderboard 0 9 WITHSCORES   # 내림차순 top 10
ZRANK leaderboard "user1"              # 순위 (0부터)
ZINCRBY leaderboard 100 "user1"        # 점수 증가

Node.js (ioredis)

import Redis from 'ioredis'
 
const redis = new Redis({
  host: 'localhost',
  port: 6379,
})
 
// 기본 캐시 패턴
async function getCachedUser(id: number): Promise<User> {
  const cached = await redis.get(`user:${id}`)
  if (cached) return JSON.parse(cached)
 
  const user = await db.findUser(id)
  await redis.setex(`user:${id}`, 3600, JSON.stringify(user))
  return user
}
 
// 분산 락
async function withLock(key: string, fn: () => Promise<void>) {
  const acquired = await redis.set(key, '1', 'NX', 'EX', 10)
  if (!acquired) throw new Error('락 획득 실패')
  try {
    await fn()
  } finally {
    await redis.del(key)
  }
}

주요 설정 (redis.conf)

maxmemory 256mb
maxmemory-policy allkeys-lru   # 메모리 초과 시 LRU 방식으로 삭제
appendonly yes                  # AOF 영속화 활성화
requirepass yourpassword

메모