Redis 는 테이블도 컬럼도 없다. 관계형 데이터를 옮길 때 "스키마"에 해당하는 것은 키 이름 규칙이다. 이것이 사실상 인덱스이자 테이블 이름 역할을 하므로 먼저 정한다.
흔히 쓰는 형태는 <도메인>:<식별자>:<속성> 이다.
user:1001 해시. 사용자 한 명의 속성 묶음
user:1001:sessions 집합. 그 사용자의 세션 목록
order:2025:000123 해시
idx:user:email 해시. email -> user id 역인덱스
구분자는 콜론이 관례다. Redis 자체는 의미를 두지 않지만 redis-cli --scan --pattern 'user:*' 같은 조회와 RedisInsight 의 트리 표시가 이 규칙을 전제한다.
| 명령 | 자료형 | 하는 일 |
|---|---|---|
SET k v |
문자열 | 키 하나에 값 하나 |
MSET k1 v1 k2 v2 |
문자열 | 키 여러 개를 한 번에. 원자적이다 |
HSET k f1 v1 f2 v2 |
해시 | 키 하나 안에 필드 여러 개 |
레코드 하나를 담을 때는 해시가 맞다. 필드 하나만 읽고 쓸 수 있고, 작은 해시는 listpack 으로 저장되어 메모리도 덜 쓴다.
HSET user:1001 name "홍길동" email "a@example.com" age 32
HGET user:1001 email
HGETALL user:1001
HMGET user:1001 name email
HDEL user:1001 age
HMSET 은 4.0 부터 비권장이며 HSET 이 같은 일을 한다.
문자열에 JSON 을 통째로 넣는 방법도 있다. 읽고 쓰기가 단순하지만 필드 하나만 바꾸려 해도 전체를 다시 써야 한다. 부분 갱신이 잦으면 해시, 통째로 읽고 쓰면 문자열을 고른다.
Redis 에는 UPDATE 가 없다. 쓰기 명령이 곧 덮어쓰기다.
SET k v 키가 없으면 만들고 있으면 덮는다
SET k v NX 없을 때만 쓴다
SET k v XX 있을 때만 쓴다
SET k v EX 3600 3600초 뒤 만료
SET k v KEEPTTL 기존 TTL 을 유지한 채 값만 바꾼다
SET 은 기본적으로 기존 TTL 을 지운다. 만료를 유지하려면 KEEPTTL 을 명시한다. 해시는 값을 바꿔도 키의 TTL 이 유지된다.
숫자 필드는 읽어서 더한 뒤 쓰지 말고 원자 연산을 쓴다.
INCRBY counter:page 1
HINCRBY user:1001 login_count 1
Redis 에는 조건 검색이 없다. 키를 알고 읽는 것이 기본이고, 다른 조건으로 찾아야 하면 역인덱스를 직접 만들어 둔다.
HSET idx:user:email a@example.com 1001
HGET idx:user:email a@example.com
전체를 훑어야 한다면 KEYS 를 쓰지 않는다. KEYS 는 단일 스레드를 점유해 전체 키를 훑는 동안 다른 명령이 모두 멈춘다. SCAN 은 커서를 나눠 돌려주므로 서버를 막지 않는다.
redis-cli --scan --pattern 'user:*' | head -20
SCAN 0 MATCH user:* COUNT 100
HSCAN user:1001 0
SCAN 은 반복 중 추가·삭제된 키에 대해 중복이나 누락이 생길 수 있다. 정확한 목록이 필요하면 별도의 집합(SET)으로 목록을 관리한다.
DEL user:1001
UNLINK user:1001 비동기 삭제. 큰 키에 쓴다
EXPIRE user:1001 3600
TTL user:1001
큰 해시나 리스트를 DEL 하면 그 시간만큼 서버가 멈춘다. UNLINK 는 키를 이름공간에서 떼고 실제 해제는 백그라운드에서 한다.