2008-10-29 12 views

Odpowiedz

7

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.

+0

Jednym z wyzwań jest tu a) możliwość serializacji lub b) stan wyścigu - zależy od poziomu izolacji transakcji. – stephbu

+0

W porządku, jednym z problemów, które mamy, jest prawdopodobnie stan wyścigu. Czy powinno to być wykonywane asynchronicznie? – TimLeung

+0

@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. –

5

Skutecznym sposobem może być: Przechowuj swoje liczniki w obiekcie aplikacji, możesz przechowywać go w pliku/DB okresowo i przy zamknięciu aplikacji.

0

Możesz zaimplementować IHttpHandler, aby to zrobić.

0

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.

0

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

+0

@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

11

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.

+0

Dzięki za obserwację :) – TimLeung

+0

fyi dla tych, którzy to czytają później - jestem prawie pewien, że zmienili to od pierwotnego wpisu. –

+0

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

3

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.