Redis를 쓰다 보면 WRONGTYPE 오류를 자주 보게 된다.
이 오류의 대부분은 키 타입을 잘못 쓸 때발생한다.
Redis는 모든 키가 자료구조 타입을 가진다.
예: string, list, set, hash, zset …
특히 set을 사용할 때 SREM, SMEMBERS 같은 명령어를 잘못 적용하면 타입 오류가 뜬다.
이번 글에서는 가장 많이 헷갈리는 STRING vs SET, 그리고 SREM / SMEMBERS를 정리해본다.
Redis STRING — 단일 값 저장용
Redis의 기본 자료형.
문자열 한 개만 저장할 수 있다.
예시:
SET user:1:status "online" GET user:1:status # → "online"
특징:
- 단일 값만 저장 가능
- 숫자를 저장하면 INCR/DECR 가능
- JSON, 문자열, 토큰 등 하나의 값을 저장할 때 사용
STRING 타입에서 사용할 수 있는 명령어:
- SET, GET
- INCR, DECR
- APPEND, GETSET
- …
2. Redis SET — 중복 없는 집합(Collection)
SET은 말 그대로 중복 없이 여러 값을 저장하는 집합 구조다.
예시:
SADD user:1:pc socketA SADD user:1:pc socketB SADD user:1:pc socketB # 중복 무시됨
결과:
{ socketA, socketB }
특징:
- 값 중복 없음
- 순서 없음
- 빠른 삽입/삭제/조회
- 로그인 장치 목록, 소켓 연결 목록 저장할 때 적합
SET 타입 전용 명령어:
- SADD : 값 추가
- SREM : 특정 값 삭제
- SMEMBERS : 모든 값 조회
- SCARD : 몇 개 들어있는지 확인
- SISMEMBER : 특정 값 포함 여부 확인
SREM — 집합(Set)에서 특정 값 삭제
사용 예시
SREM user:1:pc socketA
결과:
- socketA가 있으면 삭제 → 반환값 1
- socketA가 없으면 아무 변화 없음 → 반환값 0
특징
- SET일 때만 가능
- STRING, HASH 등에서 사용하면 WRONGTYPE 오류 발생
- 값 하나만 골라서 제거하는 데 최적화됨
Node.js 예시:
await client.srem(`EZ:${user_id}:pc`, socket.id);
SMEMBERS — Set 안의 모든 값 조회
사용 예시
SMEMBERS user:1:pc
결과:
1) "socketA" 2) "socketB"
특징:
- Set 내부의 모든 멤버를 가져옴
- 순서 보장 없음
- 존재하지 않는 키면 빈 배열처럼 반환
Node.js:
const sockets = await client.smembers(`EZ:${user_id}:pc`);
S 가 붙으면 SET임.
STRING vs SET
| string | set |
| 저장 구조 | 단일 값 | 중복 없는 여러 값 |
| 대표 명령어 | SET, GET | SADD, SREM, SMEMBERS |
| 순서 | O(유지 불가) | X |
| 중복 | 허용 | 허용 안 함 |
| 사용 용도 | 상태 저장, 캐시, 토큰 | 소켓 목록, 태그 리스트, 장치 리스트 |
| WRONGTYPE 위험 | 높음 (SET 명령어 사용 시 발생) | 높음 (STRING 명령어 사용 시 발생) |
'TIL' 카테고리의 다른 글
| Fernet 정리 (1) | 2025.12.29 |
|---|---|
| 마이그레이션 제대로 한 후기 (0) | 2025.12.18 |
| Docker stats로 보는 CPU 사용률 + Node.js 싱글스레드 병목 판단법 (0) | 2025.12.08 |
| NAT(Network Address Translation) 네트워크란? (0) | 2025.12.02 |
| 컨테이너 포트를 host 포트로 못 쓰면??? (0) | 2025.11.28 |