Gambaran umum jenis data Redis JSON - Amazon ElastiCache untuk Redis

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

Gambaran umum jenis data Redis JSON

ElastiCache for Redis mendukung sejumlah perintah Redis untuk menangani jenis data JSON. Berikut ini adalah gambaran umum jenis data JSON dan daftar mendetail yang berisi perintah Redis yang didukung.

Terminologi

Istilah Deskripsi

Dokumen JSON

Mengacu pada nilai kunci Redis JSON.

Nilai JSON

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

Elemen JSON

Setara dengan nilai JSON.

Standar JSON yang didukung

Format JSON sesuai dengan standar pertukaran data JSON RFC 7159 dan ECMA-404. Mendukung UTF-8 Unicode pada teks JSON.

Elemen root

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

Batas ukuran dokumen

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

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

ACL JSON

  • Serupa dengan kategori per jenis data yang ada (@string, @hash, dll.), kategori baru @json ditambahkan untuk menyederhanakan pengelolaan akses ke perintah dan data JSON. Tidak ada perintah Redis lain yang merupakan anggota kategori @json. Semua perintah JSON memberlakukan pembatasan dan izin ruang kunci atau perintah apa pun.

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

ACL
Perintah 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

Batas kedalaman bersarang

Ketika objek atau array JSON memiliki elemen yang merupakan objek atau array JSON lain, objek dalam atau array dianggap "bersarang" di dalam objek luar atau array. Batas kedalaman bersarang maksimum adalah 128. Setiap percobaan untuk membuat dokumen yang berisi kedalaman bersarang lebih dari 128 akan ditolak dengan kesalahan.

Sintaks perintah

Kebanyakan perintah memerlukan nama kunci Redis 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...]

Sintaks jalur

Redis JSON mendukung dua jenis sintaksis jalur:

  • Sintaks yang ditingkatkan – Mengikuti sintaksis JSONPath yang dijelaskan oleh Goessner, seperti yang ditunjukkan pada tabel berikut. Kami telah menyusun ulang dan memodifikasi deskripsi dalam tabel agar jelas.

  • Sintaks 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.

Sintaks 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.

&&

Logika AND, digunakan untuk menggabungkan beberapa ekspresi filter.

||

Logika OR, digunakan untuk menggabungkan beberapa ekspresi filter.

Contoh

Contoh-contoh berikut dibuat berdasarkan contoh data XML 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 dari struktur JSON.

$..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 nomor ISBN.

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

Sintaks 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 bersarang telah terlampaui.

NONEXISTENT

Kunci atau jalur tidak ada.

OUTOFBOUNDARIES

Indeks array di luar batas.

SYNTAXERR

Kesalahan sintaks.

WRONGTYPE

Jenis nilai yang salah.

Metrik terkait JSON

Tersedia metrik info JSON berikut:

Info Deskripsi

json_total_memory_bytes

Total memori yang dialokasikan untuk objek JSON.

json_num_documents

Jumlah total dokumen di Redis.

Untuk mengkueri metrik inti, jalankan perintah Redis berikut:

info json_core_metrics

Cara ElastiCache for Redis berinteraksi dengan JSON

Bagian berikut menjelaskan cara ElastiCache for Redis berinteraksi dengan jenis 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 di dalam tanda kurung dijalankan terlebih dahulu.

Perilaku batas bersarang jalur maksimum

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

Menangani nilai numerik

JSON tidak memiliki jenis data terpisah untuk angka integer dan floating point. Semuanya disebut angka.

Representasi numerik:

Ketika angka JSON diterima pada input, angka tersebut diubah menjadi salah satu dari dua representasi biner internal: integer bertanda 64-bit atau floating point presisi ganda IEEE 64-bit. String asli dan semua formatnya tidak dipertahankan. Jadi, ketika angka dihasilkan sebagai bagian dari respons JSON, angka tersebut 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 aritmatika NUMINCRBY dan NUMMULTBY:

  • Jika kedua angka ini adalah integer dan hasilnya berada di luar rentang int64, maka angka tersebut secara otomatis akan menjadi angka floating point presisi ganda IEEE 64-bit.

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

  • Jika hasilnya melebihi rentang IEEE 64-bit ganda, perintah ini menampilkan kesalahan OVERFLOW.

Untuk daftar lengkap perintah yang tersedia, lihat Perintah JSON Redis yang didukung.

Pemfilteran array langsung

ElastiCache for Redis memfilter 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 for Redis akan menampilkan [1,2,3] dalam kedua situasi ini.

Perilaku pengindeksan array

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

Untuk memastikan perilaku yang dapat diprediksi bagi pelanggan, ElastiCache for Redis 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 memberikan hasil.

Evaluasi sintaksis yang ketat

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