- Redis Hash: 하나의 키 아래 여러
field-value 쌍을 담는 자료구조. 객체 하나를 필드 단위로 저장·조회할 때 쓴다. (HSET, HGET) - Redis Sorted Set(ZSet): 각 멤버에
score(부동소수점)를 매겨 오름차순 정렬 상태로 보관하는 집합. score가 같으면 멤버 문자열 사전순으로 정렬한다. 랭킹·우선순위 큐·범위 조회에 쓴다. (ZADD, ZSCORE, ZINCRBY, ZRANGEBYSCORE, ZREM) EXPIRE는 자료구조와 무관하게 키 자체에 만료 시간을 거는 키 단위 명령이다.
EXPIRE — 키 만료 설정#
EXPIRE key seconds: 키에 TTL(Time To Live)을 초 단위로 건다. 시간이 지나면 키가 자동 삭제된다.- 반환: 설정 성공 1, 키가 없으면 0.
- 시간복잡도 O(1).
EXPIRE round:room1 30 # round:room1 키를 30초 뒤 만료
TTL round:room1 # 남은 시간(초) 조회, -1이면 만료 없음, -2면 키 없음
- 관련 명령:
PEXPIRE(밀리초), EXPIREAT(유닉스 타임스탬프 지정), PERSIST(만료 제거). - Redis 7.0부터 조건 옵션 지원:
NX(만료 없을 때만), XX(만료 있을 때만), GT/LT(새 만료가 기존보다 클/작을 때만). - 세션·일회성 상태처럼 수명이 정해진 데이터에 걸어 두면 별도 정리 작업 없이 자동 소멸시킬 수 있다.
Hash 명령어#
HSET — 필드 설정#
HSET key field value [field value ...]: 해시의 필드에 값을 저장한다. 키가 없으면 해시를 새로 만든다. 이미 있는 필드면 값을 덮어쓴다.- 반환: 새로 추가된 필드 개수(덮어쓴 필드는 세지 않는다).
- 시간복잡도 O(1) (필드 하나당).
HSET round:room1 phase PLAYING answer "노래제목" startedAt 1699000000
- 여러 필드를 한 번에 넣을 수 있어, 과거의
HMSET을 대체한다(HMSET은 4.0부터 deprecated). HSETNX는 필드가 없을 때만 설정한다.
HGET — 필드 조회#
HGET key field: 해시에서 지정한 필드의 값을 반환한다.- 반환: 값, 필드나 키가 없으면
nil. - 시간복잡도 O(1).
HGET round:room1 answer # "노래제목"
- 여러 필드를 한 번에 읽으려면
HMGET key f1 f2, 전체를 읽으려면 HGETALL key.
Sorted Set 명령어#
ZADD — 멤버 추가·score 갱신#
ZADD key score member [score member ...]: 멤버를 지정한 score로 추가한다. 이미 있는 멤버면 score를 갱신하고 정렬 위치를 다시 잡는다. score가 member보다 먼저 온다.- 반환: 기본은 새로 추가된 멤버 개수(갱신은 세지 않는다).
- 시간복잡도 O(log N) (멤버 하나당).
ZADD scoreboard:room1 0 player:A 0 player:B # 두 플레이어를 0점으로 등록
- 주요 옵션:
NX: 없는 멤버만 추가(기존 score 갱신 안 함), XX: 있는 멤버만 갱신(새로 추가 안 함).GT/LT: 새 score가 기존보다 클/작을 때만 갱신.CH: 반환값을 “추가 + 갱신"된 멤버 수로 바꾼다.INCR: ZINCRBY처럼 동작하며 갱신된 score를 반환(멤버 하나만 지정 가능).
ZSCORE — 멤버 score 조회#
ZSCORE key member: 멤버의 현재 score를 반환한다.- 반환: score(문자열), 멤버나 키가 없으면
nil. - 시간복잡도 O(1).
ZSCORE scoreboard:room1 player:A # "30"
ZINCRBY — score 증감#
ZINCRBY key increment member: 멤버의 score를 increment만큼 더한다. 멤버가 없으면 score 0에서 시작한 것으로 보고 추가하고, 키가 없으면 새로 만든다. increment에 음수를 주면 감소.- 반환: 증감 후의 새 score.
- 시간복잡도 O(log N).
ZINCRBY scoreboard:room1 10 player:A # player:A에 10점 가산, 새 점수 반환
- 정답 가산처럼 “현재 값을 읽어 더한 뒤 다시 쓰는” 흐름을 단일 원자 명령으로 처리한다. 별도 락 없이 동시 가산의 정합성을 보장한다.
ZRANGEBYSCORE — score 범위 조회#
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]: score가 min~max 구간(기본 양끝 포함)에 드는 멤버를 score 오름차순으로 반환한다.min/max에 -inf, +inf 사용 가능. ( 접두사는 경계 제외(예: (5는 5 초과).WITHSCORES: 멤버와 score를 함께 반환. LIMIT offset count: 페이징.- 반환: 조건에 맞는 멤버 배열.
- 시간복잡도 O(log N + M) (M은 반환된 멤버 수).
ZRANGEBYSCORE scoreboard:room1 50 +inf WITHSCORES # 50점 이상 플레이어를 점수순으로
- Redis 6.2부터는
ZRANGE key min max BYSCORE가 권장 대체 명령이다(ZRANGEBYSCORE는 계속 동작). 높은 점수부터 보려면 ZREVRANGEBYSCORE나 ZRANGE ... REV.
ZREM — 멤버 제거#
ZREM key member [member ...]: 지정한 멤버를 정렬 집합에서 제거한다.- 반환: 실제로 제거된 멤버 개수(없던 멤버는 세지 않는다).
- 시간복잡도 O(M log N) (M은 제거 대상 수).
- 멤버가 모두 빠져 집합이 비면 키 자체가 삭제된다.
ZREM scoreboard:room1 player:B # 나간 플레이어를 점수판에서 제거
정리 — 점수판·라운드 상태에 어떻게 매핑되나#
- 점수판은 Sorted Set 하나로 표현된다: 참가 등록
ZADD(0점), 정답 가산 ZINCRBY, 개인 점수 조회 ZSCORE, 순위·구간 조회 ZRANGEBYSCORE(또는 ZREVRANGE), 퇴장 정리 ZREM. - 라운드 상태(단계·정답·시작시각 등)는 Hash 하나에
HSET으로 필드째 저장하고 HGET으로 꺼낸다. EXPIRE로 라운드 수명을 걸어 두면 종료 후 자동으로 사라진다. - Sorted Set의 갱신·조회(
ZINCRBY, ZADD 등)는 개별적으로는 원자적이지만, “읽고→판단하고→쓰는” 다단계 로직 전체를 원자화하려면 Lua 스크립트나 트랜잭션으로 묶어야 한다.