개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Redis Set — 중복 없는 집합과 집합 연산

2026년 1월 20일
RedisSet집합태그팔로워

좋아요를 누른 사람 목록을 관리한다고 생각해봅시다. 같은 사람이 두 번 누르면 안 되고, 눌렀는지 여부를 빠르게 확인해야 합니다. Redis Set이 이 요구를 O(1)에 해결합니다.

기본 명령

추가와 삭제

# 원소 추가 (이미 있으면 무시)
SADD post:1000:liked_by "user:1" "user:5" "user:8"

# 원소 삭제
SREM post:1000:liked_by "user:5"

# 원소 개수
SCARD post:1000:liked_by
# 2

# 전체 원소 조회
SMEMBERS post:1000:liked_by
# 1) "user:1"
# 2) "user:8"

포함 여부 확인

# 특정 사용자가 좋아요 눌렀는지
SISMEMBER post:1000:liked_by "user:1"
# 1 (있음)

SISMEMBER post:1000:liked_by "user:99"
# 0 (없음)

# 여러 원소 한 번에 확인 (Redis 6.2+)
SMISMEMBER post:1000:liked_by "user:1" "user:2" "user:8"
# 1) 1
# 2) 0
# 3) 1

SISMEMBER: O(1) 시간에 원소 포함 여부를 확인. 해시 테이블로 구현되어 Set 크기와 무관하게 빠릅니다.

집합 연산

Set은 합집합, 교집합, 차집합을 직접 지원합니다.

SADD team:backend "user:1" "user:2" "user:3"
SADD team:frontend "user:2" "user:3" "user:4"

# 합집합 — 어느 팀이든 속한 사람
SUNION team:backend team:frontend
# user:1, user:2, user:3, user:4

# 교집합 — 두 팀 모두 속한 사람
SINTER team:backend team:frontend
# user:2, user:3

# 차집합 — backend에만 있고 frontend에 없는 사람
SDIFF team:backend team:frontend
# user:1

결과를 새 키에 저장하려면 SUNIONSTORE, SINTERSTORE, SDIFFSTORE를 씁니다.

SINTERSTORE team:both team:backend team:frontend
SMEMBERS team:both
# user:2, user:3

무작위 원소 꺼내기

# 무작위 원소 조회 (삭제 안 함)
SRANDMEMBER post:1000:liked_by
# "user:1"

# 무작위 원소 꺼내기 (삭제)
SPOP post:1000:liked_by
# "user:8"

추첨, 랜덤 샘플링, 무작위 알림 대상 선정 등에 씁니다.

실전 사례

좋아요 기능

# 좋아요 추가
SADD post:1000:liked_by "user:500"

# 좋아요 취소
SREM post:1000:liked_by "user:500"

# 좋아요 수
SCARD post:1000:liked_by

# 이미 좋아요 눌렀는지
SISMEMBER post:1000:liked_by "user:500"

팔로우 / 팔로워

# 철수가 영희를 팔로우
SADD user:1000:following "user:2000"
SADD user:2000:followers "user:1000"

# 공통 팔로잉 (맞팔 여부)
SINTER user:1000:following user:2000:following

# 철수 팔로잉 중 영희도 아는 사람
SINTER user:1000:following user:2000:followers

태그 시스템

# 포스트에 태그 추가
SADD post:1000:tags "Redis" "캐시" "NoSQL"

# 특정 태그가 붙은 포스트 (역인덱스)
SADD tag:Redis:posts "post:1000" "post:2000" "post:3000"
SADD tag:캐시:posts "post:1000" "post:4000"

# Redis이면서 캐시 태그도 달린 포스트
SINTER tag:Redis:posts tag:캐시:posts
# post:1000

온라인 사용자

# 접속 시
SADD online:users "user:1000"

# 접속 해제 시
SREM online:users "user:1000"

# 현재 온라인 수
SCARD online:users

# 특정 사용자 온라인 여부
SISMEMBER online:users "user:1000"

Set vs Sorted Set

포함 여부와 집합 연산만 필요하다면 Set을 씁니다. 순위나 점수가 필요하다면 Sorted Set을 씁니다.

항목SetSorted Set
원소 순서없음점수 기준 정렬
포함 여부 확인O(1)O(log N)
순위 조회불가O(log N)
메모리 사용적음더 많음
← 이전 글Redis Hash — 객체를 필드 단위로 저장하기
다음 글 →Redis Sorted Set — 점수 기반 정렬 집합과 랭킹