Hasil kueri cache di Amazon Neptunus Gremlin - Amazon Neptune

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

Hasil kueri cache di Amazon Neptunus Gremlin

Mulai rilis mesin 1.0.5.1, Amazon Neptunus mendukung cache hasil untuk kueri Gremlin.

Anda dapat mengaktifkan cache hasil kueri dan kemudian menggunakan petunjuk kueri untuk menyimpan hasil kueri hanya-baca Gremlin.

Setiap menjalankan kembali kueri kemudian mengambil hasil cache dengan latensi rendah dan tidak ada biaya I/O, selama mereka masih dalam cache. Ini berfungsi untuk kueri yang dikirimkan baik pada HTTP titik akhir dan menggunakan Websockets, baik sebagai kode byte atau dalam bentuk string.

catatan

Kueri yang dikirim ke titik akhir profil tidak di-cache bahkan ketika cache kueri diaktifkan.

Anda dapat mengontrol bagaimana cache hasil kueri Neptunus berperilaku dalam beberapa cara. Sebagai contoh:

  • Anda bisa mendapatkan hasil cache paginasi, dalam blok.

  • Anda dapat menentukan time-to-live (TTL) untuk kueri tertentu.

  • Anda dapat menghapus cache untuk kueri tertentu.

  • Anda dapat menghapus seluruh cache.

  • Anda dapat mengatur untuk diberi tahu jika hasil melebihi ukuran cache.

Cache dipertahankan menggunakan kebijakan least-recently-used (LRU), yang berarti bahwa setelah ruang yang dialokasikan ke cache penuh, least-recently-used hasilnya akan dihapus untuk memberi ruang ketika hasil baru sedang di-cache.

penting

Cache hasil kueri tidak tersedia pada t3.medium atau jenis t4.medium instance.

Mengaktifkan cache hasil kueri di Neptunus

Untuk mengaktifkan cache hasil kueri di Neptunus, gunakan konsol untuk mengatur parameter 1 instans DB neptune_result_cache ke (diaktifkan).

Setelah cache hasil diaktifkan, Neptunus menyisihkan sebagian memori saat ini untuk hasil kueri caching. Semakin besar jenis instans yang Anda gunakan dan semakin banyak memori yang tersedia, semakin banyak memori yang disisihkan Neptunus untuk cache.

Jika memori cache hasil terisi, Neptunus secara otomatis least-recently-used menjatuhkan LRU () hasil cache untuk memberi jalan bagi yang baru.

Anda dapat memeriksa status cache hasil saat ini menggunakan Status instans perintah.

Menggunakan petunjuk untuk menyimpan hasil kueri cache

Setelah cache hasil kueri diaktifkan, Anda menggunakan petunjuk kueri untuk mengontrol cache kueri. Semua contoh di bawah ini berlaku untuk traversal kueri yang sama, yaitu:

g.V().has('genre','drama').in('likes')

Menggunakan enableResultCache

Dengan cache hasil kueri diaktifkan, Anda dapat menyimpan hasil kueri Gremlin menggunakan petunjuk enableResultCache kueri, sebagai berikut:

g.with('Neptune#enableResultCache', true) .V().has('genre','drama').in('likes')

Neptunus kemudian mengembalikan hasil kueri kepada Anda, dan juga menyimpannya dalam cache. Kemudian, Anda dapat mengakses hasil cache dengan mengeluarkan kueri yang persis sama lagi:

g.with('Neptune#enableResultCache', true) .V().has('genre','drama').in('likes')

Kunci cache yang mengidentifikasi hasil cache adalah string kueri itu sendiri, yaitu:

g.V().has('genre','drama').in('likes')

Menggunakan enableResultCacheWithTTL

Anda dapat menentukan berapa lama hasil kueri harus di-cache dengan menggunakan petunjuk enableResultCacheWithTTL kueri. Misalnya, kueri berikut menentukan bahwa hasil kueri akan kedaluwarsa setelah 120 detik:

g.with('Neptune#enableResultCacheWithTTL', 120) .V().has('genre','drama').in('likes')

Sekali lagi, kunci cache yang mengidentifikasi hasil cache adalah string kueri dasar:

g.V().has('genre','drama').in('likes')

Dan lagi, Anda dapat mengakses hasil cache menggunakan string kueri itu dengan petunjuk enableResultCache kueri:

g.with('Neptune#enableResultCache', true) .V().has('genre','drama').in('likes')

Jika 120 detik atau lebih telah berlalu sejak hasilnya di-cache, kueri itu akan mengembalikan hasil baru, dan menyimpannya dalam cache, tanpa ada time-to-live.

Anda juga dapat mengakses hasil cache dengan mengeluarkan kueri yang sama lagi dengan petunjuk enableResultCacheWithTTL kueri. Sebagai contoh:

g.with('Neptune#enableResultCacheWithTTL', 140) .V().has('genre','drama').in('likes')

Hingga 120 detik telah berlalu (yaitu, TTL saat ini berlaku), kueri baru ini menggunakan petunjuk enableResultCacheWithTTL kueri mengembalikan hasil yang di-cache. Setelah 120 detik, itu akan mengembalikan hasil baru dan menyimpannya dalam cache dengan time-to-live 140 detik.

catatan

Jika hasil untuk kunci kueri sudah di-cache, maka kunci kueri yang sama dengan enableResultCacheWithTTL tidak menghasilkan hasil baru dan tidak berpengaruh pada hasil yang time-to-live saat ini di-cache.

  • Jika hasil sebelumnya di-cache menggunakanenableResultCache, cache harus dibersihkan terlebih dahulu sebelum enableResultCacheWithTTL menghasilkan hasil baru dan menyimpannya dalam cache untuk TTL yang ditentukannya.

  • Jika hasil sebelumnya di-cache menggunakanenableResultCachewithTTL, yang sebelumnya TTL harus kedaluwarsa terlebih dahulu sebelum enableResultCacheWithTTL menghasilkan hasil baru dan menyimpannya dalam cache untuk TTL yang ditentukannya.

Menggunakan invalidateResultCacheKey

Anda dapat menggunakan petunjuk invalidateResultCacheKey kueri untuk menghapus hasil cache untuk satu kueri tertentu. Sebagai contoh:

g.with('Neptune#invalidateResultCacheKey', true) .V().has('genre','drama').in('likes')

Kueri itu menghapus cache untuk kunci kuerig.V().has('genre','drama').in('likes'), dan mengembalikan hasil baru untuk kueri itu.

Anda juga dapat menggabungkan invalidateResultCacheKey dengan enableResultCache atauenableResultCacheWithTTL. Misalnya, kueri berikut menghapus hasil cache saat ini, menyimpan hasil baru, dan mengembalikannya:

g.with('Neptune#enableResultCache', true) .with('Neptune#invalidateResultCacheKey', true) .V().has('genre','drama').in('likes')

Menggunakan invalidateResultCache

Anda dapat menggunakan petunjuk invalidateResultCache kueri untuk menghapus semua hasil cache di cache hasil kueri. Sebagai contoh:

g.with('Neptune#invalidateResultCache', true) .V().has('genre','drama').in('likes')

Kueri itu menghapus seluruh cache hasil dan mengembalikan hasil baru untuk kueri.

Anda juga dapat menggabungkan invalidateResultCache dengan enableResultCache atauenableResultCacheWithTTL. Misalnya, kueri berikut menghapus seluruh cache hasil, menyimpan hasil baru untuk kueri ini, dan mengembalikannya:

g.with('Neptune#enableResultCache', true) .with('Neptune#invalidateResultCache', true) .V().has('genre','drama').in('likes')

Paginasi hasil kueri yang di-cache

Misalkan Anda telah melakukan cache sejumlah besar hasil seperti ini:

g.with('Neptune#enableResultCache', true) .V().has('genre','drama').in('likes')

Sekarang misalkan Anda mengeluarkan kueri rentang berikut:

g.with('Neptune#enableResultCache', true) .V().has('genre','drama').in('likes').range(0,10)

Neptunus pertama kali mencari kunci cache penuh, yaitu. g.V().has('genre','drama').in('likes').range(0,10) Jika kunci itu tidak ada, Neptunus selanjutnya melihat apakah ada kunci untuk string kueri itu tanpa rentang (yaitu). g.V().has('genre','drama').in('likes') Ketika menemukan kunci itu, Neptunus kemudian mengambil sepuluh hasil pertama dari cache-nya, seperti yang ditentukan oleh rentang.

catatan

Jika Anda menggunakan petunjuk invalidateResultCacheKey kueri dengan kueri yang memiliki rentang di akhir, Neptunus menghapus cache untuk kueri tanpa rentang jika tidak menemukan kecocokan yang tepat untuk kueri dengan rentang tersebut.

Menggunakan numResultsCached dengan .iterate()

Dengan menggunakan petunjuk numResultsCached kueri, Anda dapat mengisi cache hasil tanpa mengembalikan semua hasil yang di-cache, yang dapat berguna saat Anda memilih untuk membuat halaman sejumlah besar hasil.

Petunjuk numResultsCached kueri hanya berfungsi dengan kueri yang diakhiri dengan. iterate()

Misalnya, jika Anda ingin menyimpan 50 hasil pertama dari kueri sampel:

g.with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 50) .V().has('genre','drama').in('likes').iterate()

Dalam hal ini kunci kueri dalam cache adalah:g.with("Neptune#numResultsCached", 50).V().has('genre','drama').in('likes'). Anda sekarang dapat mengambil sepuluh pertama dari hasil cache dengan kueri ini:

g.with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 50) .V().has('genre','drama').in('likes').range(0, 10)

Dan, Anda dapat mengambil sepuluh hasil berikutnya dari kueri sebagai berikut:

g.with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 50) .V().has('genre','drama').in('likes').range(10, 20)

Jangan lupa sertakan numResultsCached petunjuknya! Ini adalah bagian penting dari kunci kueri dan karena itu harus ada untuk mengakses hasil cache.

Beberapa hal yang perlu diingat saat menggunakan numResultsCached
  • Nomor yang Anda berikan numResultsCached diterapkan di akhir kueri.   Ini berarti, misalnya, bahwa kueri berikut sebenarnya cache menghasilkan rentang(1000, 1500):

    g.with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 500) .V().range(1000, 2000).iterate()
  • Nomor yang Anda berikan numResultsCached menentukan jumlah maksimum hasil untuk cache.   Ini berarti, misalnya, bahwa kueri berikut sebenarnya cache menghasilkan rentang(1000, 2000):

    g.with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 100000) .V().range(1000, 2000).iterate()
  • Hasil yang di-cache oleh kueri yang diakhiri dengan .range().iterate() memiliki jangkauannya sendiri.   Misalnya, Anda menyimpan hasil cache menggunakan kueri seperti ini:

    g.with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 500) .V().range(1000, 2000).iterate()

    Untuk mengambil 100 hasil pertama dari cache, Anda akan menulis kueri seperti ini:

    g.with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 500) .V().range(1000, 2000).range(0, 100)

    Seratus hasil itu akan setara dengan hasil dari kueri dasar dalam kisaran tersebut(1000, 1100).

Kunci cache kueri yang digunakan untuk menemukan hasil cache

Setelah hasil kueri di-cache, kueri berikutnya dengan kunci cache kueri yang sama mengambil hasil dari cache daripada menghasilkan yang baru. Kunci cache kueri dari kueri dievaluasi sebagai berikut:

  1. Semua petunjuk kueri terkait cache diabaikan, kecuali untuk. numResultsCached

  2. iterate()Langkah terakhir diabaikan.

  3. Sisa kueri diurutkan sesuai dengan representasi kode byte.

String yang dihasilkan dicocokkan dengan indeks hasil kueri yang sudah ada di cache untuk menentukan apakah ada cache hit untuk kueri.

Misalnya, ambil kueri ini:

g.withSideEffect('Neptune#typePromotion', false).with("Neptune#enableResultCache", true) .with("Neptune#numResultsCached", 50) .V().has('genre','drama').in('likes').iterate()

Ini akan disimpan sebagai versi byte-code ini:

g.withSideEffect('Neptune#typePromotion', false) .with("Neptune#numResultsCached", 50) .V().has('genre','drama').in('likes')

Pengecualian terkait dengan cache hasil

Jika hasil kueri yang Anda coba cache terlalu besar untuk dimasukkan ke dalam memori cache bahkan setelah menghapus semua yang sebelumnya di-cache, Neptunus menimbulkan kesalahan. QueryLimitExceededException Tidak ada hasil yang dikembalikan, dan pengecualian menghasilkan pesan galat berikut:

The result size is larger than the allocated cache, please refer to results cache best practices for options to rerun the query.

Anda dapat menekan pesan ini menggunakan petunjuk noCacheExceptions kueri, sebagai berikut:

g.with('Neptune#enableResultCache', true) .with('Neptune#noCacheExceptions', true) .V().has('genre','drama').in('likes')