JSONikhtisar tipe data - Amazon ElastiCache

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

JSONikhtisar tipe data

ElastiCache mendukung sejumlah OSS perintah Valkey dan Redis untuk bekerja dengan tipe JSON data. Berikut ini adalah ikhtisar tipe JSON data dan daftar rinci perintah yang didukung.

Terminologi

Istilah Deskripsi

JSONdokumen

Mengacu pada nilai JSON kunci.

JSONnilai

Mengacu pada subset JSON dokumen, termasuk root yang mewakili seluruh dokumen. Nilai bisa berupa kontainer atau entri dalam kontainer.

JSONelemen

Setara dengan JSON nilai.

JSONStandar yang didukung

JSONFormat sesuai dengan standar pertukaran data RFC7159 dan ECMA-404JSON. UTF-8 Unicode dalam JSON teks didukung.

Elemen root

Elemen root dapat berupa tipe JSON data apa pun. Perhatikan bahwa di RFC 4627 sebelumnya, hanya objek atau array yang diizinkan sebagai nilai root. Sejak pembaruan ke RFC 7159, root JSON dokumen dapat berupa tipe JSON data apa pun.

Batas ukuran dokumen

JSONdokumen disimpan secara internal dalam format yang dioptimalkan untuk akses cepat dan modifikasi. Format ini biasanya menimbulkan konsumsi cukup banyak memori daripada representasi terserialisasi yang setara dari dokumen yang sama.

Konsumsi memori oleh satu JSON dokumen dibatasi hingga 64 MB, yang merupakan ukuran struktur data dalam memori, bukan JSON string. Anda dapat memeriksa jumlah memori yang dikonsumsi oleh JSON dokumen dengan menggunakan JSON.DEBUG MEMORY perintah.

JSON ACLs

  • Mirip dengan kategori per-tipe data yang ada (@string, @hash, dll.), Kategori baru @json ditambahkan untuk menyederhanakan pengelolaan akses ke perintah dan data. JSON Tidak ada OSS perintah Valkey atau Redis lain yang ada sebagai anggota kategori @json. Semua JSON perintah memberlakukan batasan dan izin keyspace atau perintah apa pun.

  • Ada lima OSS ACL kategori Valkey dan Redis yang diperbarui untuk menyertakan JSON perintah baru: @read, @write, @fast, @slow dan @admin. Tabel berikut menunjukkan pemetaan JSON perintah ke kategori yang sesuai.

ACL
JSONperintah @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

Batas kedalaman sarang

Ketika sebuah JSON objek atau array memiliki elemen yang merupakan JSON objek atau array lain itu sendiri, objek dalam atau array dikatakan “sarang” di dalam objek luar atau array. Batas kedalaman sarang maksimum adalah 128. Setiap percobaan untuk membuat dokumen yang berisi kedalaman bersarang lebih dari 128 akan ditolak dengan kesalahan.

Sintaksis perintah

Kebanyakan perintah memerlukan nama kunci sebagai argumen pertama. Beberapa perintah juga memiliki argumen jalur. Argumen jalur ditetapkan secara default ke root jika bersifat opsional dan tidak disediakan.

Notasi:

  • Argumen wajib diapit oleh tanda kurung sudut. Misalnya: <key>

  • Argumen opsional diapit oleh tanda kurung siku. Misalnya: [path]

  • Argumen opsional tambahan ditunjukkan oleh elipsis ("..."). Misalnya: [json...]

Sintaksis jalur

Redis JSON mendukung dua jenis sintaks jalur:

  • Sintaks yang disempurnakan - Mengikuti JSONPath sintaks yang dijelaskan oleh Goessner, seperti yang ditunjukkan pada tabel berikut. Kami telah menyusun ulang dan mengubah deskripsi dalam tabel agar jelas.

  • Sintaksis terbatas – Memiliki kemampuan kueri terbatas.

catatan

Hasil dari beberapa perintah bersifat sensitif terhadap jenis sintaksis jalur yang digunakan.

Jika jalur kueri diawali dengan '$', kueri tersebut menunjukkan penggunaan sintaksis yang ditingkatkan. Jika tidak, maka kueri tersebut menggunakan sintaksis terbatas.

Sintaksis yang ditingkatkan

Simbol/Ekspresi Deskripsi

$

Elemen root.

. atau []

Operator turunan.

..

Penurunan rekursif.

*

Wildcard. Semua elemen dalam sebuah objek atau array.

[]

Operator subskrip array. Indeks berbasis 0.

[,]

Operator Union.

[start:end:step]

Operator irisan array.

?()

Menerapkan ekspresi filter (skrip) ke array atau objek saat ini.

()

Ekspresi filter.

@

Digunakan dalam ekspresi filter yang merujuk ke simpul saat ini yang sedang diproses.

==

Sama dengan, digunakan dalam ekspresi filter.

!=

Tidak sama dengan, digunakan dalam ekspresi filter.

>

Lebih dari, digunakan dalam ekspresi filter.

>=

Lebih dari atau sama dengan, digunakan dalam ekspresi filter.

<

Kurang dari, digunakan dalam ekspresi filter.

<=

Kurang dari atau sama dengan, digunakan dalam ekspresi filter.

&&

LogisAND, digunakan untuk menggabungkan beberapa ekspresi filter.

||

Logika OR, digunakan untuk menggabungkan beberapa ekspresi filter.

Contoh

Contoh berikut dibangun di atas contoh XML data Goessner, yang telah kami modifikasi dengan menambahkan bidang tambahan.

{ "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 } } }
Jalur Deskripsi

$.store.book[*].author

Penulis semua buku di toko.

$..author

Semua penulis.

$.store.*

Semua anggota toko.

$["store"].*

Semua anggota toko.

$.store..price

Harga semua yang ada di toko.

$..*

Semua anggota rekursif JSON struktur.

$..book[*]

Semua buku.

$..book[0]

Buku pertama.

$..book[-1]

Buku terakhir.

$..book[0:2]

Dua buku pertama.

$..book[0,1]

Dua buku pertama.

$..book[0:4]

Buku dari indeks 0 hingga 3 (indeks akhir tidak inklusif).

$..book[0:4:2]

Buku pada indeks 0, 2.

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

Semua buku dengan ISBN nomor.

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

Semua buku yang lebih murah dari $10.

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

Semua buku yang lebih murah dari $10. (Jalur harus diberi tanda kutip jika berisi spasi.)

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

Semua buku yang lebih murah dari $10.

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

Semua buku yang lebih murah dari $10.

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

Semua buku dalam kisaran harga $10 hingga $100, inklusif.

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

Semua buku dalam kisaran harga $10 hingga $100, inklusif. (Jalur harus diberi tanda kutip jika berisi spasi.)

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

Semua buku yang terjual atau habis.

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

Semua buku yang terjual atau habis. (Jalur harus diberi tanda kutip jika berisi spasi.)

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

Semua buku dalam kategori fiksi.

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

Semua buku dalam kategori nonfiksi.

Contoh ekspresi filter tambahan:

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]"

Sintaksis terbatas

Simbol/Ekspresi Deskripsi

. atau []

Operator turunan.

[]

Operator subskrip array. Indeks berbasis 0.

Contoh

Jalur Deskripsi

.store.book[0].author

Penulis dari buku pertama.

.store.book[-1].author

Penulis dari buku terakhir.

.address.city

Nama kota.

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

Judul buku pertama.

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

Judul buku terakhir.

catatan

Semua konten Goessner yang dikutip dalam dokumentasi ini diatur dengan Lisensi Creative Commons.

Awalan kesalahan umum

Setiap pesan kesalahan memiliki awalan. Berikut ini adalah daftar awalan kesalahan umum.

Awalan Deskripsi

ERR

Kesalahan umum.

LIMIT

Kesalahan yang terjadi ketika batas ukuran terlampaui. Misalnya, batas ukuran dokumen atau batas kedalaman sarang telah terlampaui.

NONEXISTENT

Kunci atau jalur tidak ada.

OUTOFBOUNDARIES

Indeks array di luar batas.

SYNTAXERR

Kesalahan sintaksis.

WRONGTYPE

Jenis nilai yang salah.

JSON-metrik terkait

Metrik JSON info berikut disediakan:

Info Deskripsi

json_total_memory_bytes

Total memori yang dialokasikan ke JSON objek.

json_num_documents

Jumlah total dokumen di Valkey atau OSS Redis.

Untuk menanyakan metrik inti, jalankan perintah berikut:

info json_core_metrics

Bagaimana ElastiCache dengan Valkey dan Redis berinteraksi OSS dengan JSON

Bagian berikut menjelaskan bagaimana ElastiCache dengan Valkey dan Redis OSS berinteraksi dengan tipe data. JSON

Prasyarat operator

Saat mengevaluasi ekspresi bersyarat untuk pemfilteran, &&s diutamakan terlebih dahulu, lalu ||s dievaluasi, seperti yang umum di sebagian besar bahasa. Operasi dalam tanda kurung dijalankan terlebih dahulu.

Perilaku batas bersarang jalur maksimum

Batas bersarang jalur maksimum di ElastiCache (RedisOSS) adalah 128. Jadi nilai seperti $.a.b.c.d... hanya bisa mencapai 128 tingkat.

Menangani nilai numerik

JSONtidak memiliki tipe data terpisah untuk bilangan bulat dan angka floating point. Semuanya disebut angka.

Representasi numerik:

Ketika JSON nomor diterima pada input, itu diubah menjadi salah satu dari dua representasi biner internal: integer bertanda 64-bit atau floating point presisi IEEE ganda 64-bit. String asli dan semua formatnya tidak dipertahankan. Jadi, ketika angka adalah output sebagai bagian dari JSON respons, itu dikonversi dari representasi biner internal ke string yang dapat dicetak yang menggunakan aturan pemformatan generik. Aturan-aturan ini dapat menghasilkan string yang berbeda dari string yang diterima.

Perintah aritmetika NUMINCRBY dan NUMMULTBY:

  • Jika kedua angka adalah bilangan bulat dan hasilnya berada di luar jangkauanint64, secara otomatis menjadi nomor floating point presisi IEEE ganda 64-bit.

  • Jika setidaknya salah satu angka adalah floating point, hasilnya adalah nomor floating point presisi IEEE ganda 64-bit.

  • Jika hasilnya melebihi kisaran 64-bit IEEE ganda, perintah mengembalikan OVERFLOW kesalahan.

Untuk daftar lengkap perintah yang tersedia, lihat Perintah Valkey dan OSS Redis yang didukung.

Pemfilteran array langsung

ElastiCache dengan Valkey atau Redis OSS menyaring objek array secara langsung.

Untuk data seperti [0,1,2,3,4,5,6] dan kueri jalur seperti$[?(@<4)], atau data seperti {"my_key":[0,1,2,3,4,5,6]} dan kueri jalur seperti$.my_key[?(@<4)], ElastiCache dengan Valkey atau Redis OSS akan mengembalikan [1,2,3] dalam kedua keadaan.

Perilaku pengindeksan array

ElastiCache dengan Valkey atau Redis OSS memungkinkan indeks positif dan negatif untuk array. Untuk array dengan panjang lima, 0 akan mengueri elemen pertama, 1 yang kedua, dan seterusnya. Angka negatif dimulai pada akhir array, jadi -1 akan mengueri elemen kelima, -2 akan mengueri elemen keempat, dan seterusnya.

Untuk memastikan perilaku yang dapat diprediksi bagi pelanggan, ElastiCache dengan Valkey atau Redis OSS tidak membulatkan indeks array ke bawah atau ke atas, jadi jika Anda memiliki array dengan panjang 5, memanggil indeks 5 atau lebih tinggi, atau -6 atau lebih rendah, tidak akan menghasilkan hasil.

Evaluasi sintaksis yang ketat

MemoryDB tidak mengizinkan JSON jalur dengan sintaks yang tidak valid, bahkan jika subset dari jalur berisi jalur yang valid. Hal ini dimaksudkan untuk menjaga perilaku yang benar bagi pelanggan kami.