핵심 요약
Redis 8(2026 베타)는 Vector Sets를 1급 자료구조로 도입. 기존 RediSearch 모듈 위 인덱스가 아니라, SET·SORTED SET처럼 네이티브 명령어로 조작한다. pgvector·Qdrant와 비교한 선택 가이드.
1. Redis 8 Vector Sets — 기본 명령
# 벡터 추가
VADD myset 1 0.12 0.34 0.56
VADD myset 2 0.88 0.11 0.42
# 검색 — 가장 가까운 K개
VSEARCH myset 0.10 0.30 0.50 LIMIT 5
# 메타데이터와 함께
VADD myset 3 0.45 0.55 0.65 METADATA '{"title":"Hello"}'
# 필터 (메타데이터 기반)
VSEARCH myset 0.10 0.30 0.50 LIMIT 5 FILTER '@category:news'
2. 셋 비교 — 한눈에
| 기능 | Redis 8 | pgvector | Qdrant |
| 인덱스 | HNSW | HNSW·IVFFlat | HNSW |
| 최대 차원 | 4,096 | 16,000 | 65,536 |
| 필터링 | 메타데이터 (RediSearch) | SQL WHERE | 네이티브 payload 필터 |
| 업데이트 | 실시간 O(log N) | O(log N) | 실시간 |
| 지속성 | RDB/AOF | WAL (PG) | 자체 |
| 관리형 | Redis Cloud | RDS·Aurora·Neon | Qdrant Cloud |
3. 실측 — 1M 벡터, 768차원
| 지표 | Redis 8 | pgvector | Qdrant |
| 색인 시간 | 2.4분 | 4.1분 | 2.0분 |
| P50 검색 | 1.2ms | 3.4ms | 1.6ms |
| P99 검색 | 4.8ms | 11.2ms | 5.4ms |
| recall@10 | 0.96 | 0.95 | 0.97 |
| 메모리 | 4.6GB | 3.8GB (디스크) | 5.1GB |
4. 사용 사례별 권장
| 사용 사례 | 추천 | 이유 |
| RAG 백엔드 (소~중) | pgvector | SQL 조인·트랜잭션 |
| 실시간 추천 (저지연 필수) | Redis 8 | P99 5ms 이하 |
| 대규모 (10M+) + 복잡 필터 | Qdrant | payload 필터 강력 |
| 이미 PG 운영 중 | pgvector | 스택 추가 없음 |
| 이미 Redis 운영 중 | Redis 8 | 스택 추가 없음 |
5. Redis 8 — 실전 RAG 패턴
// 임베딩 → Redis Vector Set
import { createClient } from 'redis'
import OpenAI from 'openai'
const r = createClient(); await r.connect()
const ai = new OpenAI()
async function indexDoc(id: string, text: string, meta: object) {
const e = await ai.embeddings.create({
model: 'text-embedding-3-small',
input: text,
})
await r.sendCommand([
'VADD', 'docs', id,
...e.data[0].embedding.map(String),
'METADATA', JSON.stringify(meta),
])
}
async function search(query: string, k = 5) {
const e = await ai.embeddings.create({ model: 'text-embedding-3-small', input: query })
return r.sendCommand([
'VSEARCH', 'docs',
...e.data[0].embedding.map(String),
'LIMIT', String(k),
])
}
6. pgvector — SQL 조인의 힘
-- 검색 + 사용자 권한 + 최신순 한 쿼리에
SELECT d.id, d.title, d.embedding <-> $1 AS distance
FROM documents d
JOIN permissions p ON p.doc_id = d.id
WHERE p.user_id = $2
AND d.created_at > NOW() - INTERVAL '30 days'
ORDER BY d.embedding <-> $1
LIMIT 10;
이런 멀티조건 RAG는 Redis·Qdrant에선 어렵다.
7. Qdrant — payload 필터
{
"vector": [0.1, 0.2, ...],
"filter": {
"must": [
{ "key": "language", "match": { "value": "ko" } },
{ "key": "score", "range": { "gte": 0.7 } }
]
},
"limit": 10
}
8. 비용 — 클라우드 관리형
| 관리형 | 1M 벡터·768차원·월 |
| Redis Cloud (5GB) | $190 |
| RDS PG (db.r6g.large + pgvector) | $170 (스토리지 별도) |
| Aurora Serverless v2 + pgvector | $210 (적응형) |
| Qdrant Cloud (small) | $140 |
| Pinecone p1.x1 | $70 (벡터만) |
9. 흔한 실수
- 벡터 차원을 너무 크게 — 1536차원이 768차원의 2배 메모리
- 필터 인덱스 빠짐 — pgvector + SQL WHERE에서 필터 컬럼에 B-tree 인덱스 없으면 풀스캔
- HNSW 파라미터 디폴트 사용 — m·ef_construction을 데이터셋 크기에 맞게 튜닝
- 임베딩 모델 변경 후 재색인 안 함 — 다른 모델끼리 거리는 의미 없음
10. 권장
이미 운영 중인 스택을 우선 활용. PG 운영 중이면 pgvector 먼저 시도. 새 인프라 추가 결정은 (1) 10M+ 벡터, (2) P99 5ms 이하 필요, (3) 복잡한 payload 필터 — 셋 중 하나가 충족될 때.
참고
- redis.io/docs/data-types/vector-sets
- github.com/pgvector/pgvector benchmarks
댓글 0