Redis는 흔히 캐시로만 사용된다고 생각하지만, 사실 훨씬 강력한 기능을 제공한다. 특히 RedisJSONRedisSearch를 결합하면, 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 조합을 하나로 줄일 수 있는 강력한 솔루션이 될 수 있다. 🚀

+ Recent posts