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:
- 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?
- 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?
ajax
caching
pagination
barangnya enak
sumber
sumber
Jawaban:
Tampaknya apa yang Anda butuhkan adalah pembungkus untuk semua parameter yang mendefinisikan sebuah halaman (misalnya,
pageNumber
,pageSize
,sortType
,totalCount
, dll) dan menggunakan iniDataRequest
objek sebagai kunci untuk mekanisme caching Anda. Dari titik ini Anda memiliki sejumlah opsi untuk menangani cache: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.
sumber
Saya mungkin akan menanganinya seperti ini:
sumber
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.
sumber