18

Vâng, tôi nghĩ rằng tôi có một nghi ngờ rất cơ bản ở đây:Google App Engine: Memcache hoặc biến tĩnh?

Tôi đang phát triển một ứng dụng trên game (Java) và thực hiện một truy vấn đến kho dữ liệu trả về rất nhiều của các tổ chức, vì vậy tôi cần phải cache nó . Tôi đã sử dụng memcache và nó đã làm việc rất tốt, nhưng nếu tôi giữ danh sách các thực thể trong một biến tĩnh, toàn bộ yêu cầu sẽ nhanh hơn gấp đôi so với việc sử dụng memcache. Tôi nghĩ đó là bởi vì tôi không deserializing các thực thể tất cả các thời gian.

Điều gì sẽ là nhược điểm của việc sử dụng biến tĩnh thay vì trên memcache? Tôi không biết nếu có thể có một số trường hợp ứng dụng của tôi trong đám mây, và do đó một số trường hợp của biến tĩnh của tôi?

Danh sách các đơn vị tôi đang cố gắng để bộ nhớ cache là tốt nhất (điểm cao hơn) bài viết của tuần trước. Tôi lấy danh sách đó và chọn 5 bài viết ngẫu nhiên và hiển thị chúng trong một vài trang.

Cảm ơn sự giúp đỡ!

+3

Tôi đã bắt đầu thử nghiệm để tìm hiểu tần suất GAE cung cấp cho bạn một JVM mới: http://thrdcntr.appspot.com/. Rõ ràng, chúng sinh ra các máy ảo mới (trái với các luồng mới trong cùng một máy ảo) khi tải cao. Họ cũng tắt máy ảo không sử dụng sau một thời gian (nhưng không quá thường xuyên). – Thilo

Trả lời

16

App Engine quy mô bằng cách tạo ra các trường hợp mới của ứng dụng của bạn như số lượng người dùng đánh nó tăng. Như drudru nói, người dùng khác nhau có thể được phục vụ bởi các trường hợp khác nhau. Nói chung, memcache là nơi nhanh nhất để lưu trữ một cái gì đó bạn muốn được thống nhất trên toàn cầu. Tuy nhiên, trong trường hợp của bạn có thể có một số phòng để cải thiện.

Bạn đề cập đến bạn có một danh sách các bài viết và bạn ngẫu nhiên chọn 5 để hiển thị cho người dùng. Có vấn đề gì nếu 2 người dùng khác nhau thấy một nhóm 5 người khác nhau? Tuy nhiên, nếu bạn chọn ngẫu nhiên, có thể không quan trọng. Sau đó, bạn có thể lưu trữ danh sách đầy đủ các bài viết trong memcache, và kéo 5 danh sách ngẫu nhiên ra khỏi memcache và lưu trữ chúng trong một biến tĩnh.

Thứ hai, những gì chính xác là gì memcaching, và làm thế nào bạn kéo nó ra? Bạn đang lưu trữ toàn bộ một loạt các bài đăng đầy đủ trong memcache, nhận tất cả chúng, sau đó chọn 5? Có lẽ bạn chỉ có thể tải xuống danh sách bài đăng, chọn 5 và chỉ nhận được 5 bạn cần? Nếu bạn nghĩ rằng đó là deserializing đó làm chậm bạn xuống, điều này có thể giúp đỡ. Bạn đang thực hiện bất kỳ xử lý nào trên các bài đăng sau khi bạn nhận được chúng? Nếu có, kết quả của quá trình xử lý đó có được lưu trữ không?

+0

Có: Tôi đang ghi nhớ toàn bộ danh sách bài đăng và nhận tất cả bài đăng, sau đó chọn 5. Sẽ nhanh hơn (và thông minh hơn!) Nếu tôi chỉ nhận được 5 tôi muốn. Như bạn đã nói, không quan trọng nếu 2 người dùng khác nhau thấy một nhóm 5 người khác.Trong thực tế, nếu một người dùng tải lại trang, tập hợp sẽ khác, vì vậy có lẽ tôi có thể tiếp tục sử dụng biến tĩnh? Tôi thực sự không quan tâm nếu có một số trường hợp danh sách khác nhau. Cảm ơn Peter !! – Damian

+0

Nếu bạn muốn cố gắng đạt được mọi hiệu suất cuối cùng có thể, bạn có thể thử hai mức bộ nhớ cache. Khi có yêu cầu, trước tiên bạn sẽ kiểm tra xem bạn có giá trị hợp lệ trong bộ nhớ cache biến tĩnh hay không và nếu không, bạn sẽ kiểm tra memcache. Nếu không có gì hợp lệ trong memcache, thì bạn sẽ lấy dữ liệu từ kho dữ liệu, và cư trú cả memcache lẫn biến tĩnh của bạn. –

+1

Một điều cuối cùng - thao tác này ảnh hưởng đến tổng thời gian tải trang của bạn bao nhiêu? Nếu bạn nhận được hoạt động này để đi từ 10 ms đến 5 ms, đó là mát mẻ, nhưng nếu bạn có một số hoạt động khác mà mất 300ms, bạn nên tập trung năng lượng của bạn có đầu tiên :) –

3

Vâng, không có gì bảo đảm rằng ví dụ của bạn sẽ giống nhau cho người dùng khác nhau trên internet. Bạn có thể sẽ liên tục đọc điều này vào tĩnh trong trường hợp xấu nhất. Memcache có bảo đảm cao hơn khi có sẵn. Tôi sẽ chỉ sử dụng memcache và ứng dụng của bạn sẽ không có bất kỳ vấn đề về quy mô nào trong tương lai.

6

Bạn không thể dựa vào các biến tĩnh (hoặc bất cứ điều gì khác trong bộ nhớ JVM) được xung quanh khi yêu cầu tiếp theo lượt truy cập, bởi vì Google là miễn phí để bắt đầu và ngừng các máy ảo khi họ cảm thấy như nó. Từ vẻ ngoài của nó, họ dường như thích để bắt đầu thêm JVM thay vì các chủ đề bổ sung trong cùng một JVM, trong đó hợp chất vấn đề này.

Tuy nhiên, bạn sẽ có thể sử dụng các biến tĩnh dưới dạng lớp bộ nhớ cache, miễn là bạn có cách tải dữ liệu từ một nơi khác nếu nó biến mất.

Tôi cũng sẽ không cố gắng vượt quá mức sử dụng bộ nhớ ở đó, phải có hạn ngạch về số bộ nhớ bạn có thể sử dụng.