본문 바로가기
Database2026년 5월 4일6분 읽기

Redis 8 Vector Sets — pgvector·Qdrant와 어디서 갈리는가

YS
김영삼
조회 1154
Redis 8 Vector Sets — pgvector·Qdrant와 어디서 갈리는가

핵심 요약

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 8pgvectorQdrant
인덱스HNSWHNSW·IVFFlatHNSW
최대 차원4,09616,00065,536
필터링메타데이터 (RediSearch)SQL WHERE네이티브 payload 필터
업데이트실시간 O(log N)O(log N)실시간
지속성RDB/AOFWAL (PG)자체
관리형Redis CloudRDS·Aurora·NeonQdrant Cloud

3. 실측 — 1M 벡터, 768차원

지표Redis 8pgvectorQdrant
색인 시간2.4분4.1분2.0분
P50 검색1.2ms3.4ms1.6ms
P99 검색4.8ms11.2ms5.4ms
recall@100.960.950.97
메모리4.6GB3.8GB (디스크)5.1GB

4. 사용 사례별 권장

사용 사례추천이유
RAG 백엔드 (소~중)pgvectorSQL 조인·트랜잭션
실시간 추천 (저지연 필수)Redis 8P99 5ms 이하
대규모 (10M+) + 복잡 필터Qdrantpayload 필터 강력
이미 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. 흔한 실수

  1. 벡터 차원을 너무 크게 — 1536차원이 768차원의 2배 메모리
  2. 필터 인덱스 빠짐 — pgvector + SQL WHERE에서 필터 컬럼에 B-tree 인덱스 없으면 풀스캔
  3. HNSW 파라미터 디폴트 사용 — m·ef_construction을 데이터셋 크기에 맞게 튜닝
  4. 임베딩 모델 변경 후 재색인 안 함 — 다른 모델끼리 거리는 의미 없음

10. 권장

이미 운영 중인 스택을 우선 활용. PG 운영 중이면 pgvector 먼저 시도. 새 인프라 추가 결정은 (1) 10M+ 벡터, (2) P99 5ms 이하 필요, (3) 복잡한 payload 필터 — 셋 중 하나가 충족될 때.

참고

  • redis.io/docs/data-types/vector-sets
  • github.com/pgvector/pgvector benchmarks

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록