Apa praktik terbaik untuk menyimpan hasil paginasi yang urutan / propertinya dapat berubah?

11

Apa praktik terbaik untuk melakukan caching hasil pencarian paginasi yang pemesanan / propertinya dapat diubah?

Katakanlah, dalam aplikasi saya, seseorang ingin melihat 20 utas diskusi terakhir (dari 10.000). Permintaan akan dikirim ke database, melalui servlet, untuk mengambil 20 catatan pertama dari tabel utas diskusi sebagai XML / JSON. Jika kemudian mereka ingin melihat 20 berikutnya, mereka pergi ke halaman hasil berikutnya dan ini memicu permintaan lain untuk mendapatkan lot berikutnya (batas dan offset = 20, dll.).

Untuk mengurangi beban server dan menunggu klien, saya ingin membuat cache halaman hasil sebelumnya. Namun, saya punya dua pertanyaan:

  1. Tabel hasil yang ditunjukkan dapat dipesan oleh lebih dari satu atribut (yaitu, tanggal pembuatan utas, penulis utas, terakhir-pasca-tanggal). Ini berarti bahwa pernyataan seperti '20 hasil pertama' tidak masuk akal tanpa konteks (yaitu, dengan apa kita memesan). Bagaimana front-end berkomunikasi dengan back-end apa yang sudah dimuat? Pikiran pertama saya adalah menggunakan ID untuk setiap hasil tetapi mengirimkan ini kembali ke server pada permintaan berikutnya (dan memfilter hasil berdasarkan pada mereka) akan sama menyita waktu dengan mengirim semuanya kembali secara membabi buta. Bagaimana saya bisa melakukan ini?
  2. Bagaimana jika suatu atribut dari hasil yang sebelumnya dikembalikan (yaitu, paling baru-baru-pasca-tanggal) telah berubah? Kami kemudian perlu cara memeriksa setiap hasil untuk melihat apakah sudah dimodifikasi di sisi server sejak di-paging. Bagaimana saya bisa melakukan ini?
barangnya enak
sumber
Contoh Anda agak kasar. Jika hanya 100 utas, Anda sebaiknya mengunduh 100 semuanya sekaligus. Jika Anda menarik 20 dari 10.000, itu cerita yang berbeda.
Dan Pichelman
@DanPichelman Maaf, saya agak tidak jelas. Itu akan lebih seperti 10.000.
goodsquishy
Nomor yang diedit untuk kejelasan.
goodsquishy
Apakah ini http? Jika ya, mengapa tidak hanya cache berdasarkan url? Memiliki semua parameter di url. Jika itu peramban, coba gunakan tembolok peramban. Jika ini sebuah aplikasi, tetapkan cache kedaluwarsa. Volley Android bekerja dengan cukup baik.
frostymarvelous

Jawaban:

7

Tampaknya apa yang Anda butuhkan adalah pembungkus untuk semua parameter yang mendefinisikan sebuah halaman (misalnya, pageNumber, pageSize, sortType, totalCount, dll) dan menggunakan ini DataRequestobjek sebagai kunci untuk mekanisme caching Anda. Dari titik ini Anda memiliki sejumlah opsi untuk menangani cache:

  • Terapkan semacam mekanisme batas waktu untuk menyegarkan kembali cache (berdasarkan seberapa sering data berubah).
  • Minta pendengar yang memeriksa perubahan basis data dan memperbarui cache berdasarkan parameter di atas.
  • Jika perubahan dilakukan dengan proses yang sama, Anda selalu dapat menandai cache sebagai usang dengan setiap perubahan dan memeriksa bendera ini ketika halaman diminta.

Dua yang pertama mungkin melibatkan mekanisme penjadwal untuk memicu pada beberapa interval atau berdasarkan suatu peristiwa. Yang terakhir mungkin lebih sederhana jika Anda memiliki satu jalur akses data.

Terakhir, seperti yang disebutkan oleh @DanPichelman, ini dapat dengan cepat menjadi algoritma yang terlalu rumit yang melebihi manfaatnya, jadi pastikan keuntungan dalam kinerja membenarkan kompleksitas algoritma.

rae1
sumber
3

Saya mungkin akan menanganinya seperti ini:

  1. Perlakukan urutan berbeda sebagai urutan berbeda secara bersamaan. Tidak ada gunanya pembukuan tambahan untuk melacak apa yang dimiliki masing-masing klien (atau mengirimkannya berulang-ulang).
  2. Setiap kali halaman pengguna, segera ditampilkan dari cache sementara pada saat yang sama mengirim GET ke server yang menyertakan hash atau waktu akses terakhir. Server hanya mengirim kembali satu halaman penuh jika ada sesuatu yang berubah.
  3. Ambil dari server lebih dari satu halaman UI sekaligus. Misalnya, jika UI Anda menampilkan 20 entri, kueri 60. Saya perlu menguji yang ini, tetapi harapan saya adalah bahwa ukuran pengembalian paling efisien biasanya akan lebih besar daripada jumlah rata-rata data yang ditampilkan pada satu halaman. Ini juga membuat UI sangat responsif untuk beberapa pergantian halaman.
  4. Prefetch reslts saat Anda mendekati batas. Ini membantu menghemat waktu muat yang cepat dari cache.
Chris Pitman
sumber
2

Hanya pemikiran - dalam panggilan server Anda, berikan parameter biasa ditambah array hash MD5 yang mewakili halaman data yang sebelumnya dilihat dalam cache yang di-cache.

Panggilan balik akan berisi semua data yang biasa untuk halaman saat ini yang baru, ditambah pembaruan untuk halaman yang sudah lama dilihat sebelumnya. Anda dapat menggunakan hash lama sebagai kuncinya.

Saya akan merekomendasikan banyak tes kinerja & waktu pertama - kode sisi klien Anda akan menjadi jauh lebih rumit daripada jika Anda menekan server untuk setiap halaman data. Pastikan kompleksitas ekstra menghasilkan peningkatan yang berarti.

Dan Pichelman
sumber
Terima kasih atas jawaban anda. Saya berpikir tentang hashing tetapi tidak yakin apakah itu akan membantu dengan skenario pemesanan ulang (yaitu, itu tidak cukup granular, dan hanya beroperasi berdasarkan per-halaman, bukan per-hasil). Saya pikir paragraf terakhir Anda adalah poin yang baik, dan saya mulai berpikir bahwa kompleksitas dari setiap solusi yang mungkin akan lebih besar daripada manfaat kinerja.
goodsquishy