개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Redis String — 가장 기본적인 자료구조

2026년 1월 14일
RedisString캐시카운터세션

Redis에서 가장 많이 쓰이는 자료구조가 String입니다. 이름은 문자열이지만 정수, 부동소수점, 바이너리 데이터까지 담을 수 있습니다. 최대 512MB까지 저장 가능합니다.

기본 명령

SET / GET

SET user:1000:name "철수"
GET user:1000:name
# "철수"

SET score 100
GET score
# "100"

만료 시간 설정

# 3600초(1시간) 뒤 자동 삭제
SET session:abc123 "user_data" EX 3600

# 밀리초 단위
SET rate:user:1000 0 PX 60000

# Unix 타임스탬프까지만 유지
SET token:xyz "secret" EXAT 1718700000

존재할 때만 / 없을 때만 쓰기

# 키가 없을 때만 저장 (NX: Not eXists)
SET lock:resource "owner" NX EX 30
# 이미 있으면 nil 반환

# 키가 있을 때만 덮어쓰기 (XX: eXists)
SET config:rate "100" XX

숫자 연산

String에 숫자를 저장하면 원자적 증감 명령을 사용할 수 있습니다.

SET page:views 0

INCR page:views      # 1 (1씩 증가)
INCR page:views      # 2
INCRBY page:views 5  # 7 (5씩 증가)
DECR page:views      # 6 (1씩 감소)
DECRBY page:views 3  # 3 (3씩 감소)

# 부동소수점
SET price 10.50
INCRBYFLOAT price 2.5  # 13.0

INCR은 단일 스레드 환경에서 원자적으로 실행됩니다. 여러 클라이언트가 동시에 INCR을 호출해도 값이 정확히 증가합니다. 이를 데이터베이스로 구현하려면 트랜잭션이 필요하지만 Redis에서는 그냥 씁니다.

원자적(Atomic): 연산이 중간에 끊기지 않고 완전히 실행되거나 전혀 실행되지 않는 특성. Redis의 INCR은 읽기-수정-쓰기가 하나의 연산으로 처리됩니다.

여러 키 한 번에 처리

MSET user:1 "철수" user:2 "영희" user:3 "민준"
MGET user:1 user:2 user:3
# 1) "철수"
# 2) "영희"
# 3) "민준"

네트워크 왕복 횟수를 줄여 성능을 높일 수 있습니다.

주요 사용 사례

캐시

# DB에서 가져온 데이터를 1시간 캐시
SET cache:user:1000 '{"name":"철수","role":"admin"}' EX 3600

# 조회 시 캐시 히트 여부 확인
GET cache:user:1000
# 있으면 바로 반환, 없으면 DB 조회 후 캐시에 저장

세션 저장소

# 로그인 성공 시 세션 저장 (7일)
SET session:xyz789 '{"userId":1000,"role":"admin"}' EX 604800

# 요청마다 세션 확인
GET session:xyz789

# 로그아웃
DEL session:xyz789

Rate Limiting

# 1분에 100번 요청 제한
# 최초 요청 시 카운터 생성 + 만료 시간 설정
SET rate:user:1000 1 NX EX 60

# 이후 요청마다 카운터 증가
INCR rate:user:1000
# 100 초과 시 요청 거부

# 남은 만료 시간 확인 (창 리셋까지 남은 시간)
TTL rate:user:1000

분산 락

# 락 획득 (NX: 없을 때만, 30초 만료)
SET lock:payment:1000 "server-1" NX EX 30

# 작업 완료 후 락 해제 (자신이 건 락만 해제해야 함)
GET lock:payment:1000  # "server-1"인지 확인 후
DEL lock:payment:1000

키 네이밍 컨벤션

Redis Key는 콜론(:)으로 계층을 구분하는 것이 일반적입니다.

패턴: 도메인:식별자:필드
예시:
  user:1000:name
  session:abc123
  rate:user:1000
  cache:product:500
  lock:payment:1000

키가 많아지면 이 패턴으로 구분하기가 쉽습니다. SCAN 명령에서 MATCH user:*처럼 패턴으로 검색할 수도 있습니다.

← 이전 글Redis 자료구조 — 용도에 맞는 타입 선택하기
다음 글 →Redis List — 순서 있는 목록과 큐 구현