Redis는 흔히 캐시로만 사용된다고 생각하지만, 사실 훨씬 강력한 기능을 제공한다. 특히 RedisJSON과 RedisSearch를 결합하면, Redis를 단순한 캐시가 아니라 초고속 NoSQL 문서 저장소 및 검색 엔진으로 활용할 수 있다.
이 조합을 활용하면 MongoDB나 Elasticsearch 같은 NoSQL 솔루션을 대체할 수도 있으며, 검색 성능을 획기적으로 개선할 수 있다. 특히 JSON 데이터를 빠르게 저장하고 검색해야 하는 시스템에서 강력한 대안이 된다.
RedisJSON: Redis에서 JSON 문서 저장 및 조작하기
RedisJSON은 Redis에 JSON 데이터를 네이티브로 저장할 수 있도록 설계된 모듈이다. 기존에는 JSON을 문자열로 저장하고, 가져온 뒤 파싱하는 방식이었다면, 이제는 JSON을 네이티브 객체로 저장하고, 특정 필드만 업데이트하거나 조회할 수 있다.
RedisJSON의 주요 특징
1. JSON 데이터를 네이티브로 저장 가능
• set 명령어 대신 JSON.SET 사용
• 특정 필드만 수정 가능 (JSON.SET user $.age 30)
2. SQL 없이도 JSON 필드 조회 및 업데이트 가능
• JSON.GET으로 특정 필드만 가져오기
• JSON.ARRAPPEND, JSON.ARRINDEX로 JSON 배열 조작
3. 메모리 효율적인 저장 방식
• 내부적으로 효율적인 압축 및 바이너리 포맷 사용
• Redis의 인메모리 성능을 유지하면서도 JSON 문서를 다룰 수 있음
RedisJSON 활용 예제
# RedisJSON 모듈이 활성화된 Redis 컨테이너 실행
docker run -d --name redis-stack -p 6379:6379 redis/redis-stack
import redis
# Redis 클라이언트 연결
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
# JSON 문서 저장
r.execute_command('JSON.SET', 'user:1', '$', '{"name": "Alice", "age": 25, "skills": ["Python", "Redis"]}')
# 특정 필드 가져오기
print(r.execute_command('JSON.GET', 'user:1', '$.name')) # ["Alice"]
# JSON 필드 업데이트
r.execute_command('JSON.SET', 'user:1', '$.age', '30')
# 배열 데이터 추가
r.execute_command('JSON.ARRAPPEND', 'user:1', '$.skills', '"Docker"')
# 최종 결과 확인
print(r.execute_command('JSON.GET', 'user:1'))
출력 결과:
이 방식은 기존의 SET 명령어로 JSON을 문자열로 저장하는 방식보다 훨씬 효율적이며, 특정 필드만 업데이트할 수 있어서 네트워크 비용도 절감할 수 있다.
RedisSearch: Redis에서 초고속 검색 구현하기
RedisSearch는 JSON 데이터나 문자열 데이터를 기반으로 인덱싱 및 검색 기능을 추가하는 모듈이다. Elasticsearch처럼 텍스트 검색, 필터링, 정렬, 랭킹 기능을 지원하며, Redis의 초고속 성능을 그대로 유지한다.
RedisSearch의 주요 기능
1. 역색인(Inverted Index) 기반 초고속 검색
• Elasticsearch와 유사한 강력한 검색 성능을 제공
• 완전한 텍스트 검색 및 정렬 기능 지원
2. JSON 및 해시 데이터 인덱싱 지원
• FT.CREATE를 사용하여 JSON 문서 필드를 인덱싱 가능
• RedisJSON과 결합하여 MongoDB+Elasticsearch 조합을 Redis 하나로 해결
3. 쿼리 기능 강화
• FT.SEARCH로 자연어 검색 및 조건 검색 가능
• 필터링, 정렬, 페이징 지원
RedisSearch 활용 예제
먼저, JSON 데이터에 대한 검색 인덱스를 생성한다.
docker run -d --name redis-stack -p 6379:6379 redis/redis-stack
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
# RedisJSON 데이터 추가
r.execute_command('JSON.SET', 'user:1', '$', '{"name": "Alice", "age": 25, "skills": ["Python", "Redis"]}')
r.execute_command('JSON.SET', 'user:2', '$', '{"name": "Bob", "age": 30, "skills": ["Go", "Kubernetes"]}')
r.execute_command('JSON.SET', 'user:3', '$', '{"name": "Charlie", "age": 35, "skills": ["Java", "Spring"]}')
# 검색 인덱스 생성 (JSON 문서용)
r.execute_command('FT.CREATE', 'idx:user', 'ON', 'JSON',
'PREFIX', '1', 'user:',
'SCHEMA', '$.name', 'AS', 'name', 'TEXT',
'$.age', 'AS', 'age', 'NUMERIC')
# 텍스트 검색 실행
result = r.execute_command('FT.SEARCH', 'idx:user', '@name:Alice')
print(result) # JSON 문서 검색 결과 출력
출력 결과:
이제 Redis에서 단순 key-value 조회가 아니라 텍스트 검색과 필터링까지 가능하게 되었다.
RedisJSON + RedisSearch 활용 사례
✅ 1. 실시간 검색 시스템
• 검색이 필요한 서비스(예: 쇼핑몰, 뉴스, 블로그)에 적용
• Elasticsearch보다 훨씬 가벼운 대안으로 사용 가능
• JSON 문서를 저장하면서 검색을 동시에 수행
✅ 2. 세션 및 유저 데이터 저장소
• 유저 프로필 데이터(JSON)를 저장하면서, 특정 조건으로 빠르게 검색 가능
• 예: “Redis를 아는 개발자만 검색”, “30대 이상 필터링”
✅ 3. 로그 및 이벤트 분석
• 실시간 로그 데이터를 저장한 후, 특정 이벤트를 검색할 수 있음
• 빠른 분석 및 모니터링 시스템 구축 가능
결론: Redis는 더 이상 단순한 캐시가 아니다
대부분의 개발자들은 Redis를 단순한 캐시나 세션 저장소로만 사용하지만, RedisJSON과 RedisSearch를 결합하면 강력한 NoSQL 데이터베이스와 검색 엔진으로 활용할 수 있다.
💡 이 기능을 언제 사용해야 할까?
• JSON 데이터를 다루면서 빠른 검색이 필요할 때
• Redis의 초고속 성능을 그대로 유지하면서 텍스트 검색이 필요한 경우
• Elasticsearch가 너무 무거운 경우 가벼운 대체재로
즉, MongoDB + Elasticsearch 조합을 하나로 줄일 수 있는 강력한 솔루션이 될 수 있다. 🚀
'개발' 카테고리의 다른 글
Litellm: OpenAI API 비용 절감과 성능 최적화를 동시에 잡는 비밀 무기 (0) | 2025.03.05 |
---|---|
Apache Arrow: 대용량 데이터 처리의 게임 체인저 (0) | 2025.03.05 |
DuckDB: OLAP에 특화된 초고속 컬럼형 데이터베이스, SQLite를 대체할 차세대 솔루션 (0) | 2025.03.05 |
FAISS + LangChain: 초고속 벡터 검색을 활용한 문서 검색 시스템 구축하기 (1) | 2025.03.05 |
LangChain의 고급 활용: LangGraph로 멀티 에이전트 워크플로우 구축하기 (0) | 2025.03.05 |