Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

Redis를 사용한 JSON 문서의 인덱싱, 쿼리 및 전체 텍스트 검색

RedisJSON 및 RediSearch는 지금까지 클라우드에서 가장 인기 있는 Redis 모듈입니다. (그림 1 참조) RedisJSON 및 RediSearch(Redis와 함께 제공됨)의 도커 이미지는 매일 2000번 이상 풀링됩니다. 이것이 우리가 Redis의 기술 전도사 Itamar Haber를 4년 전 첫 번째 버전을 작성할 때 비전가로 생각하는 이유입니다. 4월에 RedisConf에서 JSON, 인덱싱 및 전체 텍스트 검색 기능과 관련된 몇 가지 발표를 했습니다. 오늘 이러한 기능의 비공개 미리 보기를 발표하게 되어 기쁩니다.

이 블로그에서는 현재 RedisJSON 기능에 대한 개요를 제공합니다. 그런 다음 이 비공개 미리 보기의 새로운 기능 섹션에 대해 자세히 알아보겠습니다. RediSearch를 사용하여 JSON 문서에서 전체 텍스트 검색을 인덱싱, 쿼리 및 사용하는 기능은 이번 릴리스의 가장 멋진 새 기능입니다. 마지막으로 빠르게 시작하는 방법을 알려드리겠습니다.

Redis를 사용한 JSON 문서의 인덱싱, 쿼리 및 전체 텍스트 검색

JSON 기능

RedisJSON이 없는 경우 String 데이터 구조를 사용하여 Redis에서 중첩 문서를 모델링합니다.

하지만 문서의 하위 부분을 업데이트해야 하는 경우 어떻게 해야 하나요?

작업의 원자성을 유지하려면 다음을 수행해야 합니다.

  1. 문서 보기
  2. 이전 버전을 읽고 역직렬화
  3. Redis 트랜잭션에 업데이트 포함
  4. JSON으로 직렬화 및 문서 업데이트
  5. 트랜잭션 실행

이 과정에서 다른 클라이언트가 문서를 업데이트한 경우 이 모든 단계를 다시 시도해야 할 수도 있습니다.

그러나 RedisJSON을 사용하면 단일 원자성 트랜잭션으로 이 업데이트를 수행할 수 있습니다. :

큰 JSON이 있지만 애플리케이션에서 해당 문서의 하위 부분만 필요한 다른 예를 살펴보겠습니다.

RedisJSON이 없는 경우:

다음을 수행해야 합니다.

  1. 문자열로 직렬화된 전체 json 문자열 검색
  2. JSON 역직렬화
  3. 필요한 하위 부분 추출

RedisJSON을 사용하면 단일 명령으로 필요한 데이터만 검색할 수 있어 CPU 주기, 네트워크 오버헤드, 그리고 가장 중요한 지연 시간을 최소화할 수 있습니다.

보시다시피 RedisJSON은 JSON 문서 조작을 단순화합니다. RedisJSON의 현재 GA 버전(v1.0)은 커뮤니티에서 이미 널리 사용하고 있는 버전이며 String 데이터 구조로 중첩 구조를 모델링하는 단점을 정확히 해결합니다. 다음은 몇 가지 주요 기능에 대한 개요입니다.

Redis의 키와 연결된 JSON 문서 저장(또는 업데이트)

하위 부분 바꾸기(예:키의 문자열 값)

컬렉션 또는 지도에 항목 추가

전체 문서 추출

JSONPath의 하위 집합을 사용하여 일부 추출

RedisJSON 2.0:비공개 미리보기 릴리스

RedisConf 2021에서 이 버전을 발표했으며 오늘 Redis Enterprise 고객의 일부 그룹을 위한 비공개 미리 보기 및 커뮤니티의 릴리스 후보로 사용할 수 있음을 발표하게 된 것을 기쁘게 생각합니다. 이 버전에는 세 가지 주요 기능, 즉 JSONPath 표현식의 완전한 지원, Active-Active(Redis Enterprise 포함) 지원, 그리고 RediSearch를 사용하여 JSON 문서에 대한 전체 텍스트 검색을 인덱싱, 쿼리 및 사용하는 기능이 있습니다. 하지만 더 있습니다! 새로운 기능을 살펴보겠습니다.

RUST로 다시 작성

시스템 프로그래밍 언어는 효율성을 지향하는 언어 제품군입니다. 이러한 언어로 작성된 프로그램은 일반적으로 가볍고 최상의 성능을 제공합니다. 이것이 Redis가 역사적으로 C로 작성된 이유입니다. 또한 Redis가 매우 낮은 대기 시간과 높은 처리량을 달성할 수 있는 이유를 설명합니다. 대부분의 Redis 모듈은 같은 계열의 언어인 C, C++ 또는 Rust로 작성되었습니다.

JSON은 매우 빠르고 효율적인 JSON 직렬화 및 JSONPath 구현을 포함하여 Rust 커뮤니티에서 특히 잘 제공됩니다. 이러한 구현의 이점을 Redis 사용자에게 제공하는 것은 명백했으며 Redis 모듈 API와 Rust 간의 매핑이 필요했습니다.

JSONPath에 대한 완전한 지원

그리고 여기에 이 ​​RUST 재작성의 이점이 있습니다. 이 새 버전에는 JSONPath에 대한 포괄적인 지원이 포함되어 있습니다. 이제 JSONPath 표현식의 모든 표현력을 사용할 수 있습니다.

JSON 문서 제공

와일드카드(이전에는 첫 번째 항목으로 제한됨)

조각 추출

필터 표현식을 사용한 고급 예제

액티브-액티브 지원

Active-Active는 Redis Enterprise에서 제공하는 기능입니다. Active-Active를 사용하면 데이터베이스를 지리적으로 분산된 여러 Redis Enterprise 클러스터에 복제할 수 있습니다. 사용자는 로컬 읽기 및 쓰기 대기 시간으로 가장 가까운 클러스터에 연결할 수 있습니다.

구현은 CRDT(Conflict-free Replicated Data-Type) 기술을 기반으로 합니다. Redis에서 지원하는 대부분의 핵심 데이터 구조에 대해 이를 구현하는 동안 Redis는 JSON용으로 만들어진 이 새로운 구현으로 확인된 강력한 지식과 경험을 개발했습니다.

애플리케이션 개발자는 이제 JSON 문서를 사용하여 지리적으로 분산된 애플리케이션을 구축하는 데 이 기능에 의존할 수 있습니다. 다음은 두 개의 클러스터가 있는 활성-활성 환경에서 연속적인 작업의 예입니다.

Redis를 사용한 JSON 문서의 인덱싱, 쿼리 및 전체 텍스트 검색

각 작업의 세부 정보를 살펴보겠습니다.

  • T1:클라이언트가 클러스터 1에 JSON 문서를 설정합니다.
  • T2:동기화 프로세스가 클러스터 2에 문서를 복제합니다.
  • T3:두 클러스터에 동일한 문서가 포함되어 있습니다.
  • T4:클라이언트가 클러스터 1의 색상 배열에 파란색을 추가하고 동시에 다른 클라이언트가 클러스터 2의 동일한 배열에 녹색을 추가하고 있습니다.
  • T5:동기화 프로세스가 작업을 병합하고 두 클러스터의 문서를 업데이트합니다.
  • T6:두 클러스터에 동일한 문서가 포함되어 있습니다.

이 기능이 공개 미리 보기에 있을 때 모든 동기화 흐름에 대해 더 자세히 설명하겠습니다. 하지만 이 기능에 관심이 있다면 주저하지 말고 지금 [email protected]으로 연락하세요.

RediSearch 2.2:비공개 미리보기 릴리스

이 블로그는 또한 RediSearch 2.2의 비공개 미리 보기를 사용할 수 있음을 알립니다(Redis Enterprise 고객의 일부 그룹을 위한 비공개 미리 보기 및 커뮤니티의 릴리스 후보로).

이 섹션에서는 이번 RediSearch의 새 릴리스에서 제공하는 새로운 기능에 대해 설명합니다. 하지만 먼저, 인기 있는 두 모듈을 함께 출시하는 이유가 있습니다.

JSON 문서의 인덱싱, 쿼리 및 전체 텍스트 검색

이 특별한 새로운 기능은 Redis의 JSON 기능을 완전히 새로운 수준으로 끌어올 것입니다. 지금까지 RediSearch는 키-값 저장소를 넘어 해시에 대한 인덱싱 및 검색 기능을 제공했습니다. 내부적으로 RedisJSON 2.0은 내부 공개 API를 노출합니다. 내부, 이 API가 Redis 노드 내부에서 실행되는 다른 모듈에 노출되기 때문입니다. 모든 모듈이 이 API를 사용할 수 있으므로 공용입니다. RediSearch 2.2도 마찬가지입니다!

RedisJSON은 기능을 다른 모듈에 노출함으로써 RediSearch에 JSON 문서를 인덱싱할 수 있는 기능을 제공하므로 사용자는 이제 콘텐츠를 인덱싱하고 쿼리하여 문서를 찾을 수 있습니다. 이러한 결합된 모듈은 강력하고 짧은 지연 시간의 JSON 지향 문서 데이터베이스를 제공합니다. !

이것이 어떻게 생겼는지 한 번 봅시다.

먼저 JSON.SET 명령을 사용하여 데이터베이스를 JSON 문서로 채워야 합니다.

새 인덱스를 생성하려면 FT.CREATE 명령을 사용합니다. 인덱스의 스키마는 이제 JSONPath 표현식을 허용합니다. 표현식의 결과는 인덱싱되고 속성(여기:제목)과 연결됩니다.

이제 검색 쿼리를 수행하고 FT.SEARCH를 사용하여 JSON 문서를 찾을 수 있습니다.

JSON 문서에 대한 집계

집계는 분석 보고서를 생성하거나 패싯 검색 스타일 쿼리를 수행하는 데 사용할 수 있는 RediSearch의 강력한 기능입니다. 이제 RediSearch가 JSON 문서에 액세스할 수 있으므로 JSONPath 표현식을 사용하여 JSON 문서에서 모든 값을 로드하고 값이 인덱싱되었는지 여부에 관계없이 파이프라인에서 사용할 수 있습니다.

색인을 생성해 보겠습니다.

데이터베이스에 JSON 문서 추가:

그리고 JSON 문서에서 추출한 두 개의 숫자 값을 사용하여 간단한 계산을 수행합니다.

인덱싱 전략의 유연성 향상

새 버전의 RediSearch에서는 이제 다른 매개변수를 사용하여 동일한 값(해시 필드 또는 JSON 문서의 JSON 값)을 인덱싱할 수 있습니다. 다음은 이 새로운 기능으로 해결된 일반적인 사용 사례입니다.

카테고리에 속하는 문서를 포함하는 데이터베이스가 있다고 가정해 보겠습니다.

TAG 유형을 사용하면 모든 카테고리에서 검색 결과를 쉽게 필터링할 수 있습니다.

하지만 카테고리에 대한 전체 텍스트 검색도 수행하려면 어떻게 해야 할까요?

지금까지는 해시를 사용하여 값을 2개의 필드에 복제해야 했으며, 이 경우 메모리가 2배 소모됩니다.

FT.CREATE…AS가 간편해진 곳입니다. 멋지고 간단한 문서로 돌아가 보겠습니다.

...그리고 새로운 AS 기능을 사용하십시오:

… 그리고…

빙고! 이제 태그로 필터링하고 데이터를 복제하지 않고도 동일한 필드에서 전체 텍스트 검색을 수행할 수 있습니다.

쿼리 프로파일링

대부분의 Redis 명령의 시간 복잡도는 문서화되어 있습니다. 예를 들어, HMGET은 O(N)의 복잡도와 함께 제공됩니다. 여기서 N은 요청되는 필드의 수입니다. RediSearch를 사용하면 고급 쿼리를 작성할 수 있습니다. 그러나 FT.SEARCH 및 FT.AGGREGATE 명령의 복잡성은 쿼리의 복잡성에 따라 다릅니다.

쿼리가 실행될 때 내부에서 일어나는 일을 이해하고, 시간이 소비되는 위치와 쿼리를 최적화할 수 있는 방법을 파악할 수 있는 도구를 제공하고자 했습니다. 새로운 FT.PROFILE 명령은 RediSearch가 쿼리를 실행하는 데 사용하는 주요 단계를 보여주는 트리를 반환합니다. 각 단계마다 시간 정보가 제공됩니다.

그렇다면 퍼지 검색으로 쿼리를 수행할 때 RediSearch 내부에서는 어떻게 됩니까?

예를 살펴보겠습니다.

쿼리를 프로파일링할 준비가 되었습니다. 프로파일링을 실행하고 프로파일링 결과를 분해해보자.

redis.cloud:6379> FT.PROFILE idx SEARCH LIMITED QUERY "%hello%"

먼저 결과를 얻습니다. 프로파일링 쿼리가 예상한 결과를 반환하는지 확인하는 데 유용합니다.

프로필 정보를 수집하는 데 소요된 시간을 포함하기 때문에 "프로필 시간"이라고 하는 총 시간입니다.

쿼리 구문 분석 및 실행 계획 구축에 소요된 시간:

다음은 사전에서 퍼지 일치 항목을 찾는 데 소요된 시간입니다.

마지막으로, 검색 결과를 구축한다는 것이 무엇을 의미하는지 궁금해 한 적이 있습니까? 각 문서의 전체 텍스트 점수를 계산하고 점수별로 정렬하고 마지막으로 필드를 로드해야 합니다. 이 정보를 통해 병목 현상을 식별하고 쿼리를 더 빠르게 수행하며 서버 성능을 개선할 수 있습니다.

시작하는 방법

우리는 이러한 새로운 기능이 애플리케이션 개발자와 Redis 커뮤니티의 판도를 바꿀 것이라고 믿습니다. 시작하는 방법은 다음과 같습니다.

미리보기의 도커 이미지 사용

시작하려면 :preview 태그를 사용하여 다음 도커 이미지를 가져올 수 있습니다.

docker run -p 6379:6379 redis/redismod:preview

또는 두 저장소의 RC1 릴리스 태그(RediSearch의 경우 v2.2.0, RedisJSON의 경우 v2.0.0)에서 컴파일하여 Redis에 로드할 수 있습니다.

일단 실행하고 나면 위의 모든 명령을 시도하거나 이 빠른 시작 가이드를 사용할 수 있습니다. 우리는 또한 RedisMart에 대한 일련의 블로그를 시작할 것입니다. , RedisConf 2021 기조연설에서 선보인 온라인 소매 애플리케이션. RedisMart는 지리적으로 분산된 방식으로 배포된 RediSearch 및 RedisJSON을 활용하여 최고의 온라인 소매 경험을 제공합니다. 이 시리즈에서는 이 애플리케이션을 구축하는 방법을 단계별로 안내합니다.

호환되는 클라이언트의 최신 버전을 사용하여 개발

다음 클라이언트 목록은 현재 업그레이드 중이므로 좋은 개발자 환경에서 새 기능을 사용할 수 있습니다. 최신 릴리스 및/또는 풀 리퀘스트를 확인하십시오(현재 대부분은 마스터 브랜치에서 프리뷰 버전을 지원하고 있습니다).

RedisJSON 레디서치
Node.js redis-modules-sdk redis-modules-sdk
자바 JredisJSON JRediSearch
.NET NRRedisJSON NRRediSearch
파이썬 redisjson-py 재조사-py

커뮤니티 가입

일반 공급을 위해 노력하는 동안 피드백, 버그 보고서, 기능 요청을 환영합니다. RediSearch(Github에서) 또는 RedisJSON(Github에서)의 문서 웹사이트 또는 github 리포지토리에 피드백을 남기거나 Discord에서 저희에게 연락하세요.