[Redis] 03. List와 Set
Redis의 List(순서 있는 컬렉션)와 Set(중복 없는 컬렉션) 자료구조를 정리합니다.
List
List는 순서가 있는 문자열 컬렉션입니다. 양쪽 끝에서 삽입/삭제가 O(1)로 빠릅니다.
큐(Queue), 스택(Stack), 최근 항목 목록 등에 활용됩니다.
기본 명령어
삽입
# 왼쪽(앞)에 삽입
LPUSH queue "task1"
LPUSH queue "task2" "task3"
# queue: [task3, task2, task1]
# 오른쪽(뒤)에 삽입
RPUSH queue "task4"
# queue: [task3, task2, task1, task4]
# 리스트가 존재할 때만 삽입
LPUSHX queue "task5" # 존재하면 삽입
LPUSHX nolist "task5" # 존재하지 않으면 무시
조회
# 범위 조회 (0부터 시작, -1은 마지막)
LRANGE queue 0 -1 # 전체
LRANGE queue 0 2 # 처음 3개
# 인덱스로 조회
LINDEX queue 0 # 첫 번째
LINDEX queue -1 # 마지막
# 길이
LLEN queue
삭제/추출
# 왼쪽에서 꺼내기 (큐: FIFO)
LPOP queue
# "task3"
# 오른쪽에서 꺼내기 (스택: LIFO)
RPOP queue
# "task4"
# 여러 개 꺼내기 (Redis 6.2+)
LPOP queue 2
# 특정 값 삭제 (count: 0=전체, 양수=앞에서, 음수=뒤에서)
LREM queue 0 "task2" # "task2" 모두 삭제
LREM queue 1 "task2" # 앞에서 1개만 삭제
# 범위만 남기고 삭제 (트리밍)
LTRIM queue 0 99 # 최근 100개만 유지
블로킹 명령어 (메시지 큐)
# 블로킹 왼쪽 POP (타임아웃 초)
BLPOP queue 30
# 데이터가 올 때까지 최대 30초 대기
# 블로킹 오른쪽 POP
BRPOP queue 30
# 한 리스트에서 빼서 다른 리스트에 넣기
LMOVE source destination LEFT RIGHT
BLMOVE source destination LEFT RIGHT 30
List 활용 패턴
메시지 큐 (Producer-Consumer)
# Producer: 작업 추가
RPUSH job_queue '{"type":"email","to":"user@test.com"}'
RPUSH job_queue '{"type":"sms","to":"010-1234-5678"}'
# Consumer: 작업 처리 (블로킹)
BLPOP job_queue 0
# 무한 대기하다가 작업이 오면 처리
최근 활동 로그 (최대 100개 유지)
LPUSH recent:user:123 '{"action":"login","time":"2026-05-05T10:00:00"}'
LTRIM recent:user:123 0 99
LRANGE recent:user:123 0 9 # 최근 10개 조회
타임라인 (SNS 피드)
# 새 게시글을 팔로워들의 타임라인에 추가
LPUSH timeline:user:456 "post:789"
LTRIM timeline:user:456 0 199 # 최근 200개 유지
Set
Set은 순서가 없고 중복을 허용하지 않는 문자열 컬렉션입니다.
멤버 존재 여부 확인이 O(1)로 빠르며, 집합 연산(교집합, 합집합, 차집합)을 지원합니다.
기본 명령어
추가/삭제
# 멤버 추가
SADD tags:post:1 "redis" "nosql" "database"
SADD tags:post:1 "redis" # 이미 존재하면 무시 (0 반환)
# 멤버 삭제
SREM tags:post:1 "nosql"
# 랜덤 멤버 꺼내기 (삭제됨)
SPOP tags:post:1
# 랜덤 멤버 조회 (삭제 안됨)
SRANDMEMBER tags:post:1 2 # 2개 랜덤 조회
조회
# 전체 멤버 조회
SMEMBERS tags:post:1
# 멤버 존재 여부
SISMEMBER tags:post:1 "redis"
# 1 (존재) 또는 0 (미존재)
# 여러 멤버 존재 여부 (Redis 6.2+)
SMISMEMBER tags:post:1 "redis" "java" "nosql"
# 1) 1 2) 0 3) 1
# 멤버 수
SCARD tags:post:1
집합 연산
SADD set:a "1" "2" "3" "4"
SADD set:b "3" "4" "5" "6"
# 교집합
SINTER set:a set:b
# "3", "4"
# 합집합
SUNION set:a set:b
# "1", "2", "3", "4", "5", "6"
# 차집합 (A - B)
SDIFF set:a set:b
# "1", "2"
# 결과를 새 키에 저장
SINTERSTORE result set:a set:b
SUNIONSTORE result set:a set:b
SDIFFSTORE result set:a set:b
Set 활용 패턴
태그 시스템
# 게시글에 태그 추가
SADD tags:post:1 "redis" "nosql" "tutorial"
SADD tags:post:2 "redis" "cache" "performance"
# 특정 태그의 게시글 목록
SADD tag:redis "post:1" "post:2"
SADD tag:nosql "post:1"
# "redis" AND "nosql" 태그를 모두 가진 게시글
SINTER tag:redis tag:nosql
# "post:1"
좋아요 / 팔로우
# 게시글 좋아요
SADD likes:post:123 "user:1" "user:2" "user:3"
# 좋아요 취소
SREM likes:post:123 "user:2"
# 좋아요 수
SCARD likes:post:123
# 내가 좋아요 했는지 확인
SISMEMBER likes:post:123 "user:1"
온라인 사용자 추적
# 로그인 시
SADD online_users "user:123"
# 로그아웃 시
SREM online_users "user:123"
# 현재 온라인 수
SCARD online_users
# 특정 사용자 온라인 여부
SISMEMBER online_users "user:123"
중복 방지 (방문자, IP 등)
# 오늘 방문한 IP 기록
SADD visitors:2026-05-05 "192.168.1.1" "192.168.1.2" "192.168.1.1"
# 고유 방문자 수
SCARD visitors:2026-05-05
# 2 (중복 자동 제거)
- [Redis] 11. 모니터링과 Troubleshooting
- [Redis] 10. 실전 설계 패턴
- [Redis] 09. 메모리 관리와 설정
- [Redis] 08. 복제, Sentinel, Cluster (고가용성)
- [Redis] 07. 영속성 (RDB, AOF)
- [Redis] 06. Pub/Sub, 트랜잭션, Lua 스크립팅
- [Redis] 05. 고급 자료구조 (Stream, HyperLogLog, Bitmap, Geo)
- [Redis] 04. Hash와 Sorted Set
- [Redis] 03. List와 Set
- [Redis] 02. String과 숫자 (기본 자료구조)
- [Redis] 01. Redis 소개 및 설치