레디 스 OSS JSON 데이터 유형 개요 - 아마존 ElastiCache (레디 스OSS)

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

레디 스 OSS JSON 데이터 유형 개요

ElastiCache (Redis OSS) 는 JSON 데이터 유형 작업을 위한 여러 Redis OSS 명령을 지원합니다. 다음은 JSON 데이터 유형에 대한 개요와 지원되는 Redis OSS 명령의 세부 목록입니다.

용어

용어 설명

JSON 문서

레디 스 OSS JSON 키의 값을 나타냅니다.

JSON 값

전체 문서를 나타내는 루트를 포함하는 JSON 문서의 하위 집합을 참조합니다. 값은 컨테이너 또는 컨테이너 내의 항목일 수 있습니다.

JSON 요소

JSON 값과 같습니다.

지원되는 JSON 표준

JSON 형식은 RFC 7159ECMA-404 JSON 데이터 교환 표준과 호환됩니다. JSON 형식 텍스트에서 UTF-8 유니코드가 지원됩니다.

루트 요소

루트 요소는 모든 JSON 데이터 유형일 수 있습니다. 이전 RFC 4627에서는 객체 또는 배열만 루트 값으로 허용되었습니다. RFC 7159로 업데이트한 이후 JSON 문서의 루트는 모든 JSON 데이터 유형이 될 수 있습니다.

문서 크기 제한

JSON 문서는 내부적으로 신속한 액세스 및 수정을 위해 최적화된 형식으로 저장됩니다. 이 형식은 일반적으로 동일한 문서의 동등하게 직렬화된 표현보다 어느 정도 더 많은 메모리를 소비하게 됩니다.

단일 JSON 문서에 의한 메모리 소비는 64MB로 제한됩니다. 이는 JSON 문자열이 아닌 메모리 내 데이터 구조의 크기입니다. JSON.DEBUG MEMORY 명령을 사용하여 JSON 문서가 소비하는 메모리 양을 확인할 수 있습니다.

JSON ACL

  • 기존의 데이터 유형별 범주(@string, @hash 등)와 유사합니다. JSON 명령 및 데이터에 대한 액세스 권한 관리를 단순화하기 위해 새 범주 @json이 추가되었습니다. 기존의 다른 Redis OSS 명령은 @json 범주에 속하지 않습니다. 모든 JSON 명령은 모든 키스페이스 또는 명령 제한 및 권한을 적용합니다.

  • 새로운 JSON 명령을 포함하도록 업데이트된 기존 Redis OSS ACL 카테고리에는 @read, @write, @fast, @slow @admin 등 다섯 가지가 있습니다. 다음의 표는 JSON 명령이 적절한 범주에 매핑되었음을 나타냅니다.

ACL
JSON 명령 @read @write @fast @slow @admin

JSON.ARRAPPEND

y

y

JSON.ARRINDEX

y

y

JSON.ARRINSERT

y

y

JSON.ARRLEN

y

y

JSON.ARRPOP

y

y

JSON.ARRTRIM

y

y

JSON.CLEAR

y

y

JSON.DEBUG

y

y

y

JSON.DEL

y

y

JSON.FORGET

y

y

JSON.GET

y

y

JSON.MGET

y

y

JSON.NUMINCRBY

y

y

JSON.NUMMULTBY

y

y

JSON.OBJKEYS

y

y

JSON.OBJLEN

y

y

JSON.RESP

y

y

JSON.SET

y

y

JSON.STRAPPEND

y

y

JSON.STRLEN

y

y

JSON.STRLEN

y

y

JSON.TOGGLE

y

y

JSON.TYPE

y

y

JSON.NUMINCRBY

y

y

중첩 깊이 제한

JSON 객체 또는 배열에 자체로 또 다른 JSON 객체 또는 배열인 요소가 있는 경우, 해당 내부 객체 또는 배열은 외부 객체 또는 배열 내에 '중첩'된다고 합니다. 최대 중첩 깊이 제한은 128입니다. 중첩 깊이가 128보다 큰 문서를 만들려는 시도는 오류와 함께 거부됩니다.

명령 구문

대부분의 명령에는 첫 번째 인수로 Redis OSS 키 이름이 필요합니다. 일부 명령에는 path 인수도 있습니다. path 인수가 선택 사항이며 제공되지 않는 경우 기본적으로 루트로 설정됩니다.

표기법

  • 필수 인수는 각괄호로 묶습니다. 예: <key>

  • 선택적 인수는 대괄호로 묶습니다. 예: [path]

  • 추가 선택적 인수는 줄임표('...')로 표시됩니다. 예: [json...]

경로 구문

Redis JSON은 다음과 같은 두 가지 종류의 경로 구문을 지원합니다.

  • 향상된 구문 - 다음의 표에 표시된 대로 Goessner에서 설명하는 JSONPath 구문을 따릅니다. 명확하게 하기 위해 표의 설명을 재정렬하고 수정했습니다.

  • 제한된 구문(Restricted syntax) - 쿼리 기능이 제한되었습니다.

참고

일부 명령의 결과는 사용되는 경로 구문 유형에 민감합니다.

쿼리 경로가 '$'로 시작하는 경우 향상된 구문을 사용합니다. 그렇지 않으면 제한된 구문이 사용됩니다.

향상된 구문

기호/표현식 설명

$

루트 요소.

. 또는 []

하위 연산자.

..

재귀 하강.

*

와일드카드. 객체 또는 배열의 모든 요소.

[]

배열 아래 첨자 연산자. 인덱스는 0부터 시작합니다.

[,]

조합 연산자.

[start:end:step]

배열 조각 연산자.

?()

현재 배열 또는 객체에 필터(스크립트) 표현식을 적용합니다.

()

필터 표현식.

@

처리 중인 현재 노드를 참조하는 필터 표현식에 사용됩니다.

==

같음, 필터 표현식에 사용됩니다.

!=

같지 않음, 필터 표현식에 사용됩니다.

>

더 큼, 필터 표현식에 사용됩니다.

>=

더 크거나 같음, 필터 표현식에 사용됩니다.

<

더 작음, 필터 표현식에 사용됩니다.

<=

더 작거나 같음, 필터 표현식에 사용됩니다.

&&

논리적 AND, 여러 필터 표현식을 결합하는 데 사용됩니다.

||

논리적 OR, 여러 필터 표현식을 결합하는 데 사용됩니다.

다음의 예는 추가 필드를 추가하여 수정한 Goessner의 XML 데이터 예를 기반으로 구축되었습니다.

{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "in-stock": true, "sold": true }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "in-stock": false, "sold": true }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "in-stock": true, "sold": false }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "in-stock": false, "sold": false } ], "bicycle": { "color": "red", "price": 19.95, "in-stock": true, "sold": false } } }
경로 설명

$.store.book[*].author

상점에 있는 모든 책의 저자.

$..author

모든 저자.

$.store.*

상점의 모든 구성원.

$["store"].*

상점의 모든 구성원.

$.store..price

상점에 있는 모든 것의 가격.

$..*

JSON 구조의 모든 재귀 멤버.

$..book[*]

모든 책.

$..book[0]

첫 번째 책.

$..book[-1]

마지막 책.

$..book[0:2]

처음 두 권의 책.

$..book[0,1]

처음 두 권의 책.

$..book[0:4]

인덱스 0에서 3까지의 책(끝 인덱스는 포괄적이지 않음).

$..book[0:4:2]

인덱스 0, 2의 책.

$..book[?(@.isbn)]

ISBN 번호가 있는 모든 책.

$..book[?(@.price<10)]

모든 책이 10달러보다 저렴합니다..

'$..book[?(@.price < 10)]'

모든 책이 10달러보다 저렴합니다. (경로에 공백이 포함된 경우 따옴표로 묶어야 합니다.)

'$..book[?(@["price"] < 10)]'

모든 책이 10달러보다 저렴합니다..

'$..book[?(@.["price"] < 10)]'

모든 책이 10달러보다 저렴합니다..

$..book[?(@.price>=10&&@.price<=100)]

가격대가 10달러에서 100달러인 모든 책, 포괄적.

'$..book[?(@.price>=10 && @.price<=100)]'

가격대가 10달러에서 100달러인 모든 책, 포괄적. (경로에 공백이 포함된 경우 따옴표로 묶어야 합니다.)

$..book[?(@.sold==true||@.in-stock==false)]

모든 책이 매각 또는 품절되었습니다.

'$..book[?(@.sold == true || @.in-stock == false)]'

모든 책이 매각 또는 품절되었습니다. (경로에 공백이 포함된 경우 따옴표로 묶어야 합니다.)

'$.store.book[?(@.["category"] == "fiction")]'

소설 범주의 모든 책.

'$.store.book[?(@.["category"] != "fiction")]'

비소설 범주의 모든 책.

추가 필터 표현식의 예:

127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}' OK 127.0.0.1:6379> JSON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)] "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]' "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]' "[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]' [{"price":15,"sold":false,"title":"abc"}] 127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]' 127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)] "[3,4,5]" 127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]' "[3,4,5]" 127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]' OK 127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)] "[true,true]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]' "[true,true]" 127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)] "[2,3,4]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]' "[2,3,4]"

제한된 구문(Restricted syntax)

기호/표현식 설명

. 또는 []

하위 연산자.

[]

배열 아래 첨자 연산자. 인덱스는 0부터 시작합니다.

예제

경로 설명

.store.book[0].author

첫 번째 책의 저자.

.store.book[-1].author

마지막 책의 저자.

.address.city

도시 이름.

["store"]["book"][0]["title"]

첫 번째 책의 제목.

["store"]["book"][-1]["title"]

마지막 책의 제목.

참고

이 문서에 인용된 모든 Goessner 콘텐츠는 크리에이티브 커먼즈 라이선스에 해당합니다.

일반적인 오류 접두사

각 오류 메시지에는 접두사가 있습니다. 다음은 일반적인 오류 접두사 목록입니다.

접두사  설명

ERR

일반 오류.

LIMIT

크기 제한을 초과한 경우 발생하는 오류입니다. 예: 문서 크기 제한 또는 중첩 깊이 제한이 초과되었습니다.

NONEXISTENT

키 또는 경로가 존재하지 않습니다.

OUTOFBOUNDARIES

배열 인덱스가 범위를 벗어났습니다.

SYNTAXERR

구문 오류.

WRONGTYPE

잘못된 값 유형.

JSON-관련 지표

다음과 같은 JSON 정보 지표가 제공됩니다.

정보 설명

json_total_memory_bytes

JSON 객체에 할당되는 총 메모리.

json_num_documents

Redis OSS에 있는 총 문서 수입니다.

핵심 메트릭을 쿼리하려면 다음 Redis OSS 명령을 실행합니다.

info json_core_metrics

ElastiCache (레디 스 OSS) 가 JSON과 상호 작용하는 방식

다음 섹션에서는 ElastiCache (Redis OSS) 가 JSON 데이터 유형과 상호 작용하는 방식을 설명합니다.

연산자 우선순위

필터링에 대한 조건식을 평가하는 경우 &&s가 먼저 평가되고 그 다음 ||s가 평가되는데, 이는 대부분의 언어에서 일반적으로 사용됩니다. 괄호 안의 연산이 먼저 실행됩니다.

최대 경로 중첩 제한 동작

ElastiCache (Redis OSS) 의 최대 경로 중첩 제한은 128입니다. 따라서 $.a.b.c.d...와 같은 값은 128수준까지만 도달할 수 있습니다.

숫자 값 처리

JSON에는 정수와 부동 소수점 숫자에 대해 별도의 데이터 유형이 없습니다. 모두 숫자라고 부릅니다.

숫자 표현:

입력 시 JSON 번호가 수신되면 해당 번호는 부호가 있는 64비트 정수 또는 64비트 IEEE 배정밀도 부동 소수점과 같은 두 개의 내부 이진 표현 중 하나로 변환됩니다. 원래 문자열 및 모든해당 서식은 보관되지 않습니다. 따라서 JSON 응답의 일부로 숫자가 출력되면 해당 숫자는 내부 이진 표현에서 일반 서식 규칙을 사용하는 인쇄 가능한 문자열로 변환됩니다. 이러한 규칙은 수신된 문자열과 다른 문자열이 생성될 수 있습니다.

산술 명령어 NUMINCRBYNUMMULTBY:

  • 두 숫자가 모두 정수이고 결과가 int64의 범위를 벗어나는 경우 자동으로 64비트 IEEE 배정밀도 부동 소수점 숫자가 됩니다.

  • 숫자 중 하나 이상이 부동 소수점인 경우 결과는 64비트 IEEE 배정밀도 부동 소수점 숫자입니다.

  • 결과가 64비트 IEEE 배정밀도 범위를 초과한 경우 명령은 OVERFLOW 오류를 반환합니다.

사용할 수 있는 명령의 자세한 목록은 지원되는 레디 스 OSS JSON 명령 섹션을 참조하세요.

직접 배열 필터링

ElastiCache (Redis OSS) 는 배열 객체를 직접 필터링합니다.

같은 데이터 [0,1,2,3,4,5,6] 및 경로 쿼리와 같은 데이터 또는 유사한 데이터 {"my_key":[0,1,2,3,4,5,6]} 및 경로 쿼리의 $[?(@<4)] 경우 ElastiCache (Redis OSS) 는 두 상황 모두에서 [1,2,3] 을 반환합니다. $.my_key[?(@<4)]

배열 인덱싱 동작

ElastiCache (Redis OSS) 는 배열에 양수 인덱스와 음수 인덱스를 모두 허용합니다. 길이가 5인 배열의 경우 0이 첫 번째 요소, 1이 두 번째 요소를 쿼리하는 식입니다. 음수는 배열의 끝에서 시작하므로 -1은 다섯 번째 요소를 쿼리하고, -2는 네 번째 요소를 쿼리하는 식입니다.

고객의 행동을 예측할 수 있도록 ElastiCache (Redis OSS) 는 배열 인덱스를 위아래로 또는 위로 올림 처리하지 않으므로 배열의 길이가 5인 경우 인덱스 5 이상 또는 -6 이하를 호출해도 결과가 생성되지 않습니다.

엄격한 구문 평가

MemoryDB에서는 경로의 하위 집합에 유효한 경로가 포함되어 있더라도 잘못된 구문으로 JSON 경로를 허용하지 않습니다. 이는 고객에게 올바른 행동을 유지하는 것과 같습니다.