좋아요를 누른 사람 목록을 관리한다고 생각해봅시다. 같은 사람이 두 번 누르면 안 되고, 눌렀는지 여부를 빠르게 확인해야 합니다. 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을 씁니다. 순위나 점수가 필요하다면 Sorted Set을 씁니다.
| 항목 | Set | Sorted Set |
|---|---|---|
| 원소 순서 | 없음 | 점수 기준 정렬 |
| 포함 여부 확인 | O(1) | O(log N) |
| 순위 조회 | 불가 | O(log N) |
| 메모리 사용 | 적음 | 더 많음 |