TIL

Redis String vs Set

하얀잔디 2025. 12. 18. 18:56

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 명령어 사용 시 발생)