Redis에서 가장 많이 쓰이는 자료구조가 String입니다. 이름은 문자열이지만 정수, 부동소수점, 바이너리 데이터까지 담을 수 있습니다. 최대 512MB까지 저장 가능합니다.
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
# 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:*처럼 패턴으로 검색할 수도 있습니다.