Jaki jest najlepszy sposób wdrożenia licznika wyświetleń stron, takiego jaki mają tutaj na stronie, gdzie każde pytanie ma licznik "Widoki"?Wyświetlanie strony Licznik jak na StackOverFlow
Faktoring w zakresie wydajności i skalowalności.
Jaki jest najlepszy sposób wdrożenia licznika wyświetleń stron, takiego jaki mają tutaj na stronie, gdzie każde pytanie ma licznik "Widoki"?Wyświetlanie strony Licznik jak na StackOverFlow
Faktoring w zakresie wydajności i skalowalności.
Licznik i zoptymalizowany działa tak:
UPDATE page_views SET counter = counter + 1 WHERE page_id = x
if (affected_rows == 0) {
INSERT INTO page_views (page_id, counter) VALUES (x, 1)
}
ten sposób można uruchomić 2 zapytania dla pierwszego widzenia, inne poglądy wymagają tylko 1 zapytanie.
Skutecznym sposobem może być: Przechowuj swoje liczniki w obiekcie aplikacji, możesz przechowywać go w pliku/DB okresowo i przy zamknięciu aplikacji.
Możesz zaimplementować IHttpHandler, aby to zrobić.
Jestem fanką stylu wdrażania Guillaume. Używam przezroczystego programu obsługi GIF i kolejek w pamięci do zbiorczych zestawów zmian, które są następnie okresowo przepłukiwane przy użyciu oddzielnego wątku utworzonego w pliku global.asax.
Program obsługi implementuje IHttpHandler, przetwarza parametry żądania, np. identyfikator strony, język itp., aktualizuje kolejkę, a następnie odpowiedź. zastępuje przezroczysty GIF.
Przesuwając trwałych zmian w oddzielnym wątku niż łatwość życzenie można również radzić sobie znacznie lepiej z potencjalnych problemów serializacji uruchamianie wielu serwerów itp
Oczywiście można po prostu zapłacić kogoś do pracy za przykład z przezroczystymi gifami.
Dla mnie najlepszym sposobem jest mieć pole w tabeli zapytania i aktualizować go, gdy pytanie jest dostępne
UPDATE Questions SET views = views + 1 WHERE QuestionID = x
Zastosowanie obiektu: IMO nie jest skalowalny, ponieważ może skończyć z dużą ilością zużycia pamięci jako więcej pytań jest dostępnych.
PAGE_VIEWS tabela: nie trzeba, trzeba zrobić kosztowną przystąpić po
@Eduardo jest praktyczne nawet przy 10-milionowych stronach - wciąż mówisz tylko o co najwyżej 10 milionach - myślę, że przepalam 50MB po prostu otwierając CLR;) Pamięć jest tania - serializacja nie jest. – stephbu
Zrobiłem dwie uwagi na stackoverflow licznika odsłony:
Jest link
elementem w nagłówku, który obsługuje wyzwalanie aktualizacja licznika. W przypadku tego pytania znaczniki wyglądają następująco: <link href="https://stackoverflow.com/questions/246919/increment-view-count" type="text/css" rel="stylesheet" />
Wyobrażam sobie, że możesz kliknąć ten adres URL, aby zaktualizować widok, nawet jeśli nie przeglądasz strony, ale jej nie próbowałem.
Miałem uservoice ticket, gdzie odpowiedź od Jeff wskazał, że poglądy nie są zwiększane z tego samego ip dwa razy z rzędu.
Dzięki za obserwację :) – TimLeung
fyi dla tych, którzy to czytają później - jestem prawie pewien, że zmienili to od pierwotnego wpisu. –
wydaje się być dobrym pomysłem - zachowaj licznik w zasobniku buforowanym, aby był on zwiększany tylko przy pierwszym ładowaniu zasobu. Beats pliki cookie i sesje dla prostoty. – tucuxi
Zamiast nawiązaniem połączenia z bazą danych za każdym baza danych jest trafiony, chciałbym zwiększyć licznik za pomocą obiektu cache i w zależności od tego, ile razy można dostać się do swojej stronie codziennie trzeba wysłać stronę trafia do bazy danych co 100 trafień na stronie. Jest to szybsze niż aktualizowanie bazy danych przy każdym pojedynczym trafieniu.
Innym rozwiązaniem jest analiza pliku dziennika IIS i aktualizacja wyników co 30 minut za pośrednictwem usługi systemu Windows. To jest to, co zaimplementowałem i działa cuda.
Jednym z wyzwań jest tu a) możliwość serializacji lub b) stan wyścigu - zależy od poziomu izolacji transakcji. – stephbu
W porządku, jednym z problemów, które mamy, jest prawdopodobnie stan wyścigu. Czy powinno to być wykonywane asynchronicznie? – TimLeung
@stephbu: dla twojego b) to bardziej niekrytyczne warunki wyścigowe, ponieważ zwiększenie +1 nie zmienia się, jeśli zapytanie zostanie wykonane w tym samym czasie ... +1 +1 lub +1 +1 równa zawsze +2. –