View a markdown version of this page

JSON 데이터 유형 개요 - Amazon ElastiCache

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

JSON 데이터 유형 개요

ElastiCache는 JSON 데이터 유형으로 작업하기 위해 다양한 Valkey 및 Redis OSS 명령을 지원합니다. 다음은 JSON 데이터 유형의 개요 및 지원되는 명령의 세부 목록입니다.

용어

Term 설명

JSON 문서

JSON 키의 값을 참조합니다.

JSON 값

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

JSON 요소

JSON 값과 같습니다.

지원되는 JSON 표준

JSON 형식은 RFC 7159 및 ECMA-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이 추가되었습니다. 다른 기존 Valkey 또는 Redis OSS 명령은 @json 범주에 속하지 않습니다. 모든 JSON 명령은 모든 키스페이스 또는 명령 제한 및 권한을 적용합니다.

  • @read, @write, @fast, @slow 및 @admin과 같은 새로운 JSON 명령을 포함하기 위해 업데이트된 다섯 가지 기존 Valkey 또는 Redis OSS ACL 범주가 있습니다. 다음의 표는 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보다 큰 문서를 만들려는 시도는 오류와 함께 거부됩니다.

명령 구문

대부분의 명령에는 첫 번째 인수로 키 이름이 필요합니다. 일부 명령에는 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

Valkey 또는 Redis OSS의 총 문서 수.

핵심 지표를 쿼리하려면 다음과 같은 명령을 실행합니다.

info json_core_metrics

ElastiCache for Valkey 및 Redis OSS가 JSON과 상호 작용하는 방법

다음의 섹션에서는 ElastiCache for Valkey 및 Redis OSS가 JSON과 상호 작용하는 방법을 설명합니다.

연산자 우선순위

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

최대 경로 중첩 제한 동작

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

숫자 값 처리

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

숫자 표현:

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

산술 명령어 NUMINCRBY과 NUMMULTBY:

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

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

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

사용할 수 있는 명령의 자세한 목록은 지원되는 Valkey 및 Redis OSS 명령 섹션을 참조하세요.

직접 배열 필터링

ElastiCache for Valkey 및 Redis OSS는 직접 객체 배열을 필터링합니다.

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

배열 인덱싱 동작

ElastiCache for Valkey 및 Redis OSS는 배열에 대해 포지티브 및 네거티브 인덱스 모두를 허용합니다. 길이가 5인 배열의 경우 0이 첫 번째 요소, 1이 두 번째 요소를 쿼리하는 식입니다. 음수는 배열의 끝에서 시작하므로 -1은 다섯 번째 요소를 쿼리하고, -2는 네 번째 요소를 쿼리하는 식입니다.

고객의 예측 가능한 행동을 보장하려면 ElastiCache는 배열 인덱스를 반올림이나 반내림하지 않습니다. 따라서 길이가 5인 배열이 있는 경우 인덱스 5 이상 또는 -6 이하를 직접 호출하면 결과가 생성되지 않습니다.

엄격한 구문 평가

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