Thực tiễn tốt nhất để lưu trữ kết quả phân trang bộ đệm mà thứ tự / thuộc tính có thể thay đổi là gì?


11

Cách thực hành tốt nhất để lưu bộ đệm kết quả tìm kiếm phân trang có thứ tự / thuộc tính có thể được thay đổi là gì?

Nói, trong ứng dụng của tôi, ai đó muốn xem 20 chủ đề thảo luận gần đây nhất (trong số 10.000). Một yêu cầu sẽ được gửi đến cơ sở dữ liệu, thông qua servlet, để lấy 20 bản ghi đầu tiên từ bảng chủ đề thảo luận dưới dạng XML / JSON. Nếu sau đó họ muốn xem 20 kết quả tiếp theo, họ sẽ chuyển sang trang kết quả tiếp theo và điều này sẽ thực hiện một yêu cầu khác để lấy lô tiếp theo (giới hạn và offset = 20, v.v.).

Để giảm tải máy chủ và chờ máy khách, tôi muốn lưu trữ các trang kết quả trước đó. Tuy nhiên, tôi có hai câu hỏi:

  1. Bảng kết quả được hiển thị trong có thể được sắp xếp theo nhiều hơn một thuộc tính (nghĩa là ngày tạo chủ đề, tác giả chủ đề, ngày đăng cuối cùng). Điều này có nghĩa là một tuyên bố như '20 kết quả đầu tiên' không có ý nghĩa nếu không có ngữ cảnh (nghĩa là chúng ta sắp xếp thứ gì). Làm thế nào để front-end, sau đó, giao tiếp với back-end những gì nó đã được tải? Suy nghĩ đầu tiên của tôi là sử dụng ID cho từng kết quả nhưng gửi lại cho máy chủ theo các yêu cầu tiếp theo (và lọc kết quả dựa trên chúng) sẽ tốn thời gian như gửi mọi thứ lại một cách mù quáng. Tôi có thể làm cái này như thế nào?
  2. Điều gì xảy ra nếu một thuộc tính của kết quả được trả về trước đó (nghĩa là gần đây nhất sau ngày đăng) đã thay đổi? Sau đó, chúng tôi cần một cách kiểm tra từng kết quả để xem liệu nó có bị sửa đổi phía máy chủ hay không vì nó đã được phân trang. Làm thế nào tôi có thể làm điều này?

Ví dụ của bạn hơi thô. Nếu chỉ có 100 chủ đề, tốt nhất bạn nên tải xuống tất cả 100 trong một lần. Nếu bạn đang kéo 20 trên 10.000, đó là một câu chuyện khác.
Dan Pichelman

@DanPichelman Xin lỗi, tôi có một chút không rõ ràng. Nó sẽ giống như 10.000.
hóa

Chỉnh sửa số cho rõ ràng.
hóa

Đây có phải là http không? Nếu có, tại sao không chỉ bộ đệm dựa trên url? Có tất cả các tham số trong url. Nếu đó là một trình duyệt hãy cố gắng sử dụng bộ đệm của trình duyệt. Nếu đó là một ứng dụng, hãy đặt hết hạn bộ nhớ cache. Volley của Android hoạt động khá tốt.
frostymarvelous 19/03/2015

Câu trả lời:


7

Có vẻ như những gì bạn cần là một wrapper cho tất cả các thông số xác định một trang (ví dụ pageNumber, pageSize, sortType, totalCount, vv) và sử dụng DataRequestđối tượng là chìa khóa cho cơ chế bộ nhớ đệm của bạn. Từ thời điểm này, bạn có một số tùy chọn để xử lý bộ đệm:

  • Thực hiện một số loại cơ chế hết thời gian để làm mới bộ đệm (dựa trên tần suất thay đổi dữ liệu).
  • Có một người nghe kiểm tra các thay đổi cơ sở dữ liệu và cập nhật bộ đệm dựa trên các tham số trên.
  • Nếu các thay đổi được thực hiện theo cùng một quy trình, bạn luôn có thể đánh dấu bộ đệm là lỗi thời với mọi thay đổi và kiểm tra cờ này khi một trang được yêu cầu.

Hai cái đầu tiên có thể liên quan đến một cơ chế lập lịch để kích hoạt trên một khoảng thời gian hoặc dựa trên một sự kiện. Cái cuối cùng có thể đơn giản hơn nếu bạn có một điểm truy cập dữ liệu duy nhất.

Cuối cùng, như @DanPichelman đã đề cập, nó có thể nhanh chóng trở thành một thuật toán quá phức tạp, vượt xa các lợi ích, vì vậy hãy chắc chắn rằng hiệu suất đạt được cho thấy sự phức tạp của thuật toán.


3

Tôi có thể sẽ xử lý nó như thế này:

  1. Đối xử với các thứ tự khác nhau như các trình tự khác nhau tất cả cùng nhau. Sẽ không đáng để ghi sổ thêm để theo dõi những gì mỗi khách hàng có (hoặc gửi đi gửi lại).
  2. Bất cứ khi nào các trang người dùng, hiển thị ngay lập tức từ bộ đệm trong khi đồng thời gửi GET đến máy chủ bao gồm hàm băm hoặc thời gian truy cập cuối cùng. Máy chủ chỉ gửi lại một trang đầy đủ nếu có gì đó thay đổi.
  3. Lấy từ máy chủ nhiều hơn một trang UI cùng một lúc. Ví dụ: nếu Giao diện người dùng của bạn hiển thị 20 mục, truy vấn 60. Tôi cần kiểm tra mục này, nhưng kỳ vọng của tôi là kích thước trả về hiệu quả nhất thường sẽ lớn hơn lượng dữ liệu trung bình được hiển thị trên một trang. Điều này cũng làm cho UI rất nhạy đối với một số lượt trang.
  4. Tìm nạp trước khi khởi động lại khi bạn đang ở gần một ranh giới. Điều này giúp duy trì những thời gian tải nhanh từ bộ nhớ cache.

2

Chỉ cần một suy nghĩ - trong cuộc gọi máy chủ của bạn, chuyển các tham số thông thường cộng với một mảng băm MD5 đại diện cho các trang dữ liệu được xem trước đó được lưu trong bộ nhớ cache.

Cuộc gọi trở lại sẽ chứa tất cả dữ liệu thông thường cho trang hiện tại mới, cộng với các cập nhật cho bất kỳ trang nào đã xem trước đó. Bạn có thể sử dụng hàm băm cũ làm chìa khóa.

Trước tiên, tôi khuyên bạn nên thực hiện nhiều thử nghiệm về hiệu suất và thời gian - mã phía máy khách của bạn sẽ phức tạp hơn nhiều so với nếu bạn chỉ cần nhấn máy chủ cho mỗi trang dữ liệu. Hãy chắc chắn rằng kết quả phức tạp thêm trong một cải tiến có ý nghĩa.


Cảm ơn câu trả lời của bạn. Tôi đã suy nghĩ về việc băm nhưng không chắc nó có giúp với kịch bản sắp xếp lại hay không (nghĩa là nó không đủ chi tiết và chỉ hoạt động trên cơ sở mỗi trang, không phải trên cơ sở kết quả). Tôi nghĩ rằng đoạn cuối của bạn là một điểm tốt, và đang bắt đầu nghĩ rằng sự phức tạp của bất kỳ giải pháp có thể nào sẽ vượt xa lợi ích hiệu suất.
hóa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.