Ikhtisar tipe data Redis OSS JSON - Amazon MemoryDB

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

Ikhtisar tipe data Redis OSS JSON

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

Terminologi

Istilah Deskripsi

Dokumen JSON

mengacu pada nilai kunci Redis OSS JSON

Nilai JSON

mengacu pada subset dari Dokumen JSON, termasuk root yang mewakili seluruh dokumen. Nilai bisa berupa wadah atau entri dalam wadah

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 akses cepat dan modifikasi. Format ini biasanya menghasilkan lebih banyak memori daripada representasi serial yang setara dari dokumen yang sama. Konsumsi memori oleh satu dokumen JSON dibatasi hingga 64MB, yang merupakan ukuran struktur data dalam memori, bukan string JSON. Jumlah memori yang dikonsumsi oleh dokumen JSON dapat diperiksa dengan menggunakan perintah. JSON.DEBUG MEMORY

ACL JSON

  • Jenis data JSON sepenuhnya terintegrasi ke dalam kemampuan Redis Access Control Lists (ACL). 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 perintah Redis OSS lain yang ada sebagai anggota kategori @json. Semua perintah JSON memberlakukan batasan dan izin ruang kunci atau perintah apa pun.

  • Ada lima kategori Redis OSS ACL yang diperbarui untuk menyertakan perintah JSON baru: @read, @write, @fast, @slow dan @admin. Tabel di bawah ini 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 sarang

Ketika objek atau array JSON memiliki elemen yang merupakan objek atau array JSON lain, objek dalam atau array dianggap "bersarang" 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 Redis OSS sebagai argumen pertama. Beberapa perintah juga memiliki argumen jalur. Argumen path default ke root jika opsional dan tidak disediakan.

Notasi:

  • Argumen yang diperlukan diapit dalam tanda kurung sudut, mis. <key>

  • Argumen opsional terlampir dalam tanda kurung siku, misalnya [path]

  • Argumen opsional tambahan ditunjukkan oleh..., misalnya [json...]

Sintaksis jalur

JSON-Redis OSS mendukung dua jenis sintaks jalur:

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

  • Sintaksis terbatas – Memiliki kemampuan kueri terbatas.

catatan

Hasil dari beberapa perintah sensitif jenis sintaks 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 anak

..

keturunan rekursif

*

wildcard. Semua elemen dalam sebuah objek atau array.

[]

operator subskrip array. Indeks berbasis 0.

[,]

operator serikat

[start:end:step]

operator irisan array

?()

menerapkan ekspresi filter (script) ke array atau objek saat ini

()

ekspresi filter

@

digunakan dalam ekspresi filter mengacu pada node saat ini sedang diproses

==

sama dengan, digunakan dalam ekspresi filter.

!=

tidak sama dengan, digunakan dalam ekspresi filter.

>

lebih besar dari, digunakan dalam ekspresi filter.

>=

lebih besar dari atau sama dengan, digunakan dalam ekspresi filter.

<

kurang dari, digunakan dalam ekspresi filter.

<=

kurang dari atau sama dengan, digunakan dalam ekspresi filter.

&&

logis AND, digunakan untuk menggabungkan beberapa ekspresi filter.

||

logis OR, digunakan untuk menggabungkan beberapa ekspresi filter.

Contoh

Contoh di bawah ini dibangun di atas contoh data XHTML 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 lebih murah dari $10

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

Semua buku lebih murah dari $10. (Jalur harus dikutip jika berisi spasi putih)

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

Semua buku lebih murah dari $10

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

Semua buku 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 dikutip jika berisi spasi putih)

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

semua buku terjual atau kehabisan stok

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

Semua buku terjual atau kehabisan stok. (Jalur harus dikutip jika berisi spasi putih)

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

semua buku dalam kategori fiksi

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

semua buku dalam kategori non-fiksi

Contoh ekspresi filter lainnya:

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 anak

[]

operator subskrip array. Indeks berbasis 0.

Contoh

Jalur Deskripsi

.store.book[0].author

penulis buku pertama

.store.book[-1].author

penulis 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

batas ukuran melebihi kesalahan. misalnya, batas ukuran dokumen atau batas kedalaman bersarang 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 ke objek JSON

json_num_documents

jumlah total dokumen di Redis OSS

Untuk menanyakan metrik inti, jalankan perintah Redis OSS:

info json_core_metrics

Bagaimana MemoryDB berinteraksi dengan JSON

Berikut ini menggambarkan bagaimana MemoryDB 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 di dalam tanda kurung akan dieksekusi terlebih dahulu.

Perilaku batas bersarang jalur maksimum

Batas bersarang jalur maksimum MemoryDB adalah 128. Jadi nilai seperti $.a.b.c.d... hanya bisa mencapai 128 tingkat.

Menangani nilai numerik

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

Ketika nomor JSON diterima, itu disimpan dalam salah satu dari dua format. Jika nomor cocok dengan integer bertanda 64-bit, maka itu dikonversi ke format itu; jika tidak, itu disimpan sebagai string. Operasi aritmatika pada dua nomor JSON (misalnya JSON.NUMINCRBY dan JSON.NUMMULTBY) berusaha mempertahankan presisi sebanyak mungkin. Jika dua operan dan nilai yang dihasilkan cocok dengan integer bertanda 64-bit, maka aritmatika integer dilakukan. Jika tidak, operan input diubah menjadi nomor floating point presisi ganda IEEE 64-bit, operasi aritmatika dilakukan, dan hasilnya diubah kembali menjadi string.

Perintah aritmetika NUMINCRBY dan NUMMULTBY:

  • Jika kedua angka adalah bilangan bulat, dan hasilnya berada di luar kisaran int64, secara otomatis akan menjadi nomor floating point presisi ganda.

  • Jika setidaknya salah satu angka adalah floating point, hasilnya akan menjadi nomor floating point presisi ganda.

  • Jika hasilnya melebihi kisaran ganda, perintah akan mengembalikan OVERFLOW kesalahan.

catatan

Sebelum mesin Redis OSS versi 6.2.6.R2 ketika nomor JSON diterima pada input, itu diubah menjadi salah satu dari dua representasi biner internal: integer bertanda 64-bit atau titik mengambang 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.

  • 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 yang Didukung.

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.