2012-08-16 10 views
14

Tôi đang xây dựng một ứng dụng web bằng Firebase có cùng dữ liệu và trình bày dữ liệu theo hai cách khác nhau - trong danh sách và dưới dạng điểm đánh dấu trên bản đồ google.Firebase - bộ đệm ẩn có cải thiện hiệu suất không?

Ngay bây giờ, trong mỗi chế độ xem - bản đồ hoặc danh sách - Tôi có mã để truy vấn dữ liệu từ firebase, hợp nhất với nhau và hiển thị nó. Thay vào đó, tôi đang xem xét kế hoạch này: khi khởi động, truy vấn dữ liệu, hợp nhất và lưu tất cả vào một mảng mà tôi chuyển từ chế độ xem để xem.

Trong ý nghĩa, tôi đang "lưu vào bộ nhớ cache" dữ liệu Firebase trong một mảng. Điều này không lý tưởng theo một nghĩa nào đó - dữ liệu được lưu trong bộ nhớ cache không được cập nhật khi truy vấn trực tiếp Firebase. Mặt khác, tôi chỉ gọi Firebase một lần.

Điều này có hiệu quả không? Liệu dữ liệu đọc từ Firebase có trong cùng một thứ tự thời gian lớn như đọc dữ liệu từ một mảng không?

Trả lời

21

Nói chung, dữ liệu bộ nhớ đệm để hạn chế sử dụng Firebase là không cần thiết. Firebase duy trì bộ nhớ cache của riêng dữ liệu "đang hoạt động" trên máy khách. "Hoạt động" được định nghĩa là dữ liệu mà cuộc gọi "bật" nổi bật trên đó. Do đó, đối với bất kỳ dữ liệu hoạt động nào, mọi cuộc gọi bổ sung "trên" hoặc "một lần" sẽ không yêu cầu lưu lượng mạng vì dữ liệu đã được tải.

Tôi không hoàn toàn chắc chắn ý bạn là gì khi "truy vấn firebase". Firebase không có truy vấn theo nghĩa truyền thống. Nó chỉ đơn giản là có phương pháp để gắn callbacks. Bạn có đang sử dụng chức năng "once()" để nhận dữ liệu định kỳ từ Firebase không? Nếu vậy điều này có thể có khả năng rất kém hiệu quả. Một khi là một phương pháp tiện lợi và thường chỉ nên được sử dụng cho dữ liệu được truy cập vô cùng thường xuyên hoặc vì lý do nào đó mà nhà phát triển không muốn cập nhật trong thời gian thực. Nếu không có các cuộc gọi "bật" đang hoạt động nào xuất hiện khi một lần() hoàn tất, Firebase sẽ xóa bộ nhớ cache của dữ liệu đó và mọi cuộc gọi tiếp theo đến một lần() sẽ yêu cầu một máy chủ khứ hồi tới máy chủ.

Nếu những gì bạn muốn là một cách để truy cập đồng bộ một bản sao cục bộ của phiên bản mới nhất của các dữ liệu một cách hiệu quả, tôi khuyên bạn nên phương pháp này:

var savedSnapshot = null; 
dataRef.on("value", function(snapshot) { 
    savedSnapshot = snapshot; 
}); 

//and then when you need to read the data 
var theData = savedSnapshot.val() 

Bằng cách duy trì một duy nhất trên() cuộc gọi, Firebase có thể cập nhật dữ liệu của bạn bằng cách chỉ gửi vùng đồng bằng trên dây khi mọi thứ thay đổi, thay vì tải lại tất cả dữ liệu mỗi lần bạn cần.

+1

Giải thích tuyệt vời. Các tài liệu, btw, cho ấn tượng này nhưng không đi vào chi tiết tuyệt vời như vậy (đây có thể là phụ lục tuyệt vời cho tài liệu) – Kato

+1

Chúng tôi đang lên kế hoạch bổ sung một số phần về hiệu suất cho các tài liệu trong tương lai gần. –

+0

@AndrewLee sẽ thực hiện phần này? Tôi đã sử dụng Firebase trong 2 năm nay và tôi đã không "bấm" chính xác như nó đã làm khi câu trả lời này (5 tuổi) giải thích cách bạn có thể lưu trữ dữ liệu xung quanh để sử dụng sau này. Tôi nhận ra bây giờ tôi đã được mã hóa phòng thủ khá nhiều, vì sợ không biết Firebase làm gì và không "cache" nội bộ. Bây giờ tôi thấy rằng một DataSnapshot chỉ là một con trỏ điều hướng đến một datastructure không thay đổi nội bộ và rằng 'val()' nhân bản dữ liệu của nó thành một POJO. Đây là thiết kế rất thanh lịch! Mũ tắt :-) – skrebbel