Ikhtisar jenis data Redis - Amazon ElastiCache untuk Redis

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

Ikhtisar jenis data Redis

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

Terminologi

Jangka waktu Deskripsi

Dokumen JSON

Mengacu pada nilai kunci Redis 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 RFC 7159 dan ECMA-404 JSON. UTF-8 Unicode dalam teks JSON didukung.

Elemen root

Elemen root dapat berupa jenis data apa pun. Perhatikan bahwa di RFC 4627 sebelumnya, hanya objek atau array yang diizinkan sebagai nilai root. Sejak pembaruan ke RFC 7159, akar dokumen JSON dapat berupa tipe 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 mengkonsumsi memori yang agak lebih banyak daripada representasi serial yang setara dari dokumen yang sama.

Konsumsi memori dengan 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 JSON.DEBUG MEMORY perintah.

ACL

  • Mirip dengan kategori per-datatype yang ada (@string, @hash, dll.), Kategori baru @json ditambahkan untuk menyederhanakan pengelolaan akses ke perintah dan data JSON. Tidak ada perintah Redis lain yang ada adalah anggota dari kategori @json. Semua perintah JSON memberlakukan batasan dan izin keyspace 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.LUPA

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

y

y

JSON.NUMINCRBY

y

y

Batas kedalaman sarang

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

Sintaks Perintah

Kebanyakan perintah memerlukan nama kunci Redis sebagai argumen pertama. Beberapa perintah juga memiliki argumen path. Argumen path default ke root jika opsional dan tidak disediakan.

Notasi:

  • Argumen yang diperlukan tertutup dalam kurung sudut. Sebagai contoh: <key>

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

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

Sintaks Path

Redis JSON mendukung dua jenis sintaks jalur:

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

  • Sintaks terbatas - Memiliki kemampuan kueri terbatas.

catatan

Hasil dari beberapa perintah sensitif terhadap jenis sintaks jalur yang digunakan.

Jika jalur query dimulai dengan '$', menggunakan sintaks ditingkatkan. Jika tidak, sintaks dibatasi digunakan.

Sintaks yang ditingkatkan

Simbol Deskripsi

$

Elemen root.

. atau []

Operator anak.

..

Keturunan rekursif.

*

Kartu pengganti. Semua elemen dalam sebuah objek atau array.

[]

Operator subskrip Array. Indeks berbasis 0.

[,]

Operator serikat.

[mulai: akhir: langkah]

Operator irisan Array.

?()

Berlaku filter (script) ekspresi ke array saat ini atau objek.

()

Ekspresi filter.

@

Digunakan dalam ekspresi filter yang mengacu pada node saat 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 berikut dibangun di atas contoh data XML-Goessner, yang telah kita modifikasi dengan menambahkan field 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 [*] .penulis

Para penulis semua buku di toko.

$.. penulis

Semua penulis.

$.toko. *

Semua anggota toko.

$ ["toko"] . *

Semua anggota toko.

$.store.. harga

Harga segala sesuatu di toko.

$..*

Semua anggota rekursif dari struktur JSON.

$.. buku [*]

Semua buku.

$.. buku [0]

Buku pertama.

$.. buku [-1]

Buku terakhir.

$.. buku [0:2]

Dua buku pertama.

$.. buku [0,1]

Dua buku pertama.

$.. buku [0:4]

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

$.. buku [0:4:2]

Buku pada indeks 0, 2.

$.. buku [? (@isbn)]

Semua buku dengan nomor ISBN.

$.. buku [? (@.harga<10)]

Semua buku lebih murah dari $10.

'$.. buku [? (@.harga < 10)] '

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

'$.. buku [? (@ ["harga"] < 10)] '

Semua buku lebih murah dari $10.

'$.. buku [? (@. ["harga"] < 10)] '

Semua buku lebih murah dari $10.

$.. buku [? (@.harga>= 10 &&@.harga <= 100)]

Semua buku di kisaran harga $10 sampai $100, inklusif.

'$.. buku [? (@.harga>= 10 && @.harga<= 100)] '

Semua buku di kisaran harga $10 sampai $100, inklusif. (Jalur harus dikutip jika berisi spasi putih.)

$.. buku [? (@.dijual = benar ||@.dalam stok = salah)]

Semua buku terjual atau habis stok.

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

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

'$.store.book [? (@. ["kategori"] == “fiksi”)] '

Semua buku dalam kategori fiksi.

'$.store.book [? (@. ["kategori"]! = “fiksi”)] '

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 Deskripsi

. atau []

Operator anak.

[]

Operator subskrip Array. Indeks berbasis 0.

Contoh

Jalur Deskripsi

.store.book [0] .penulis

Penulis buku pertama.

.store.book [-1] .penulis

Penulis buku terakhir.

.address.city

Nama kota.

["toko"] ["buku"] [0] ["judul"]

Judul buku pertama.

["toko"] ["buku"] [-1] ["judul"]

Judul buku terakhir.

catatan

Semua konten Goessner yang dikutip dalam dokumentasi ini tunduk pada Lisensi Creative Commons.

Awalan kesalahan umum

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

Prefiks Deskripsi

SESAT

Kesalahan umum.

MEMBATASI

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

TIDAK ADA

Kunci atau jalur tidak ada.

OUTOFBOUNDARIES

Indeks Array di luar batas.

SINTAKSIS

Kesalahan sintaks.

TIPE-KESALAHAN

Jenis nilai yang salah.

Metrik terkait JSON

Metrik info JSON berikut disediakan:

Info Deskripsi

json_total_memory_bytes

Total memori dialokasikan untuk objek JSON.

json_num_documents

Jumlah total dokumen di Redis.

Untuk query metrik inti, jalankan perintah Redis berikut:

info json_core_metrics

Bagaimana ElastiCache Redis berinteraksi dengan JSON

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

Operator diutamakan

Ketika mengevaluasi ekspresi kondisional untuk penyaringan, &&s diutamakan terlebih dahulu, dan kemudian ||s dievaluasi, seperti yang umum di sebagian besar bahasa. Operasi dalam tanda kurung dijalankan pertama.

Perilaku batas bersarang jalur maksimum

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

Menangani nilai numerik

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

Representasi numerik:

Ketika nomor JSON diterima pada input, itu diubah menjadi salah satu dari dua representasi biner internal: bilangan bulat ditandatangani 64-bit atau titik mengambang presisi ganda IEEE 64-bit. String asli dan semua formatnya tidak dipertahankan. Jadi, ketika angka adalah output sebagai bagian dari respon JSON, itu dikonversi dari representasi biner internal untuk string dicetak yang menggunakan aturan format generik. Aturan-aturan ini mungkin menghasilkan string yang berbeda yang dihasilkan dari yang diterima.

Perintah aritmatika dan: NUMINCRBY NUMMULTBY

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

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

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

Untuk daftar lengkap dari perintah yang tersedia, lihatDidukungRedisJSONperintah.

Penyaringan array langsung

ElastiCacheuntuk Redis menyaring objek array secara langsung.

Untuk data seperti [0,1,2,3,4,5,6] dan query path seperti$[?(@<4)], atau data seperti {"my_key":[0,1,2,3,4,5,6]} dan query path seperti$.my_key[?(@<4)], ElastiCache untuk Redis akan kembali [1,2,3] dalam kedua keadaan.

Perilaku pengindeksan array

ElastiCacheuntuk Redis memungkinkan kedua indeks positif dan negatif untuk array. Untuk array panjang lima, 0 akan query elemen pertama, 1 kedua, dan seterusnya. Nomor negatif mulai pada akhir array, sehingga -1 akan query elemen kelima, -2 elemen keempat, dan sebagainya.

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

Evaluasi sintaks yang ketat

MemoryDB tidak mengizinkan jalur JSON dengan sintaks yang tidak valid, bahkan jika bagian dari jalur berisi jalur yang valid. Ini untuk menjaga perilaku yang benar bagi pelanggan kami.