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 emailList
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