1q2w3e4r
15.01.2012, 23:22:48
Witam,
Mam problem z bazą danych. W jednym momencie musi być zapisanych do bazy w ciągu sekundy od jednego usera średnio 500 rekordów przez co baza nie wyrabia i tworzą się kolejki. Dodam, że każdy rekord po jednym odczytaniu przez innego usera nie jest już potrzebny i może być kasowany.
Szukałem rozwiązania i trafiłem na Memcached. Nigdy z tego nie korzystałem i zastanawia mnie na jakiej zasadzie to dokładnie działa. Dlaczego mam pytania:
1. Czy zapisując tam jedna zmienną każdy user może ja odczytać?
2. Jedna zmienna była by przypisana do danego usera. Gdzie aktualizowała by się około 500 razy na sekundę. Gdzie inny user w tym momencie by ja odczytywał..
Proszę napisać czy z Memcached jest to możliwe ?
To jest tak jakby zmienne globalne, które każdy user strony może odczytać i dodatkowo szybko się aktualizują..
Z góry dziękuję za pomoc.
gothye
16.01.2012, 08:19:48
Jest dokładnie jak piszesz czyli zapisanie zmiennej np . :
$jakas_dana = array(dane,dane .....);
w memcached
jest możliwe do odczytania i ew/modyfikacji przez innego użytkownika po nazwie jaką jej nadałeś wcześniej
by_ikar
16.01.2012, 08:36:08
Cytat
To jest tak jakby zmienne globalne, które każdy user strony może odczytać i dodatkowo szybko się aktualizują..
W zwykłym cache możesz przecież coś takiego osiągnąć.
Najbardziej mnie ciekawi, co ty tam robisz, że musisz dane 500 razy zapisać w ciągu sekundy...
Sephirus
16.01.2012, 09:13:15
Cytat
Najbardziej mnie ciekawi, co ty tam robisz, że musisz dane 500 razy zapisać w ciągu sekundy...
Właśnie - mnie też to bardzo ciekawi - czy nie da się tego jakoś "zmniejszyć"? Nawet czat nie jest tak wymagający...
Co do memcache/memcached - w tym konkretnym przypadku - odradzam stanowczo - to nie wyrobi... nie ma takiej opcji by wyrobiło. Poza tym musiałbyś dorzucić mechanizmy blokujące równoległy dostęp by dane się nie popsuły najprościej mówiąc. Jeżeli nie możesz tego pominąć i szukasz czegoś szybszego z tymi samymi możliwościami to polecam APC - Alternative PHP Cache - jest lokalnie i przez to działa o wiele szybciej...
webdice
16.01.2012, 09:29:01
Jeśli odczytujesz dane tylko raz, system cache nic Ci nie pomoże, wręcz przeciwnie.
Ad 1. Zależy co masz na myśli pisząc o użytkowniku. Jeśli chodzi o użytkowników systemu operacyjnego to tak, jeśli zaś o użytkowników aplikacja, to zależy od Ciebie.
Ad 2. Nie bardzo rozumiem o co Ci chodzi.
1q2w3e4r
16.01.2012, 12:15:01
Dziękuje za odpowiedzi.
Aktualizowana jest tutaj pozycja danego usera gdzie zmienia się ona cały czas, dla jednego usera jest to około 20 zmian pozycji w ciągu sekundy jest to minimalne ustawienie inaczej przycina się.
Jeden user tworzył by jedna zmienną do której była by przypisana tablica (złożona z 11 elementów gdzie wartości to głównie cyfry).
25 userów jest jednocześnie dlatego pisałem wcześniej o 500 zmianach w ciagu sekundy ale nie dodałem że na jedna zmienną jest 20.
Na początku myślałem robić to na plikach jednak tez by się kolejkowało chyba. Dodatkowo w przyszłości będzie to rozbudowywane i będzie więcej zapytań. Więc taki serwer Memcached byłby bardzo dobry bo można by było wykorzystywać kilka jednocześnie przy większej ilości userów.
Podsumowując każdy user będzie tworzył swoja zmienną (złożona z 11 elementów gdzie wartości to głównie cyfry) która będzie się aktualizować około 20 razy na sekundę i dane musza nadążać się nadpisywać.
webdice
16.01.2012, 12:27:40
Pomyśl, dane musisz mieć aktualne w każdej sekundzie. Aby uaktualnić cache, musisz pobrać dane z bazy. Więc pobierasz dane z bazy, umieszczasz w cache i wyświetlasz. Za sekundę musisz znowu pobrać dane, jeśli pobierałbyś je z cache, to takie rozwiązanie miało by sens, ale nie możesz bo bazie są już nowe dane. Więc wracasz do początku.
PS. Odnoszę wrażenie że nie wiesz na jakiej zasadzie działa cache. W skrócie chodzi o to że pobieranie danych jest czasochłonne, pobranie danych z mechanizmu cache jest szybsze z powodu przetrzymywania danych w pamięci (oczywiście nie zawsze).
1q2w3e4r
16.01.2012, 12:53:10
Dane tworzą się po stronie usera (w przeglądarce), które przekazywane są do skryptu metodą POST gdzie ja je będę odbierał i zapisywał cały czas do cache. (Własnie chce uniknąć bazy danych bo dane się kolejkują).
Te dane będą znów odczytywane z taka samą częstotliwością przez innego usera..
Tak to będzie działać.
Crozin
16.01.2012, 13:01:36
Czy mi się wydaje czy próbujesz 20 razy na sekundę wysyłać dane przy użyciu protokołu HTTP? To nie ma prawa działać.
Mógłbyś nieco ogólniej opisać co chcesz osiągnąć?
Uriziel01
16.01.2012, 13:20:01
Nie masz szansy aby takie coś płynnie działało (sam request przez HTTP jest dosyć wolny + obsługa zapytania po stronie serwera). Musisz zrobić coś na socketach i nie przez PHP i MySQL. Pewnie będzie najlepiej zrobić jakiś prosty Flashowy applet. Swoją drogą czy trafnie zgaduje że to jakaś gra przeglądarkowa ?
EDIT:
Jednak dużo lepszym rozwiązaniem (tak myślę) było by:
http://php.net/manual/en/book.sockets.phpTo chyba rozwiązuje twoje wszystkie problemy ?
I absolutnie NIE potrzebujesz 500 zapisów na sekundę wystarczy 10-20.
uupah5
16.01.2012, 14:49:36
idziesz w ślepą uliczkę. naginasz możliwości z góry wybranej technologii do problemu a powinieneś na podstawie problemu wybrać technologię...
danych jest mało i z twojego opisu wynika że są ulotne (jeden odczyt i tracą ważność), a głównym wymaganiem jest ich dostępność real time.
IMHO sensownym rozwiązaniem jest trzymanie tego w RAM i obsługa przez jakiś programik na serwerze, na stałe na nim uruchomiony.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.