Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Redis -> Mysql - zapis
Forum PHP.pl > Forum > Serwery WWW
Pyton_000
Bry.

Czy jest możliwy okresowy zapis z Redis do MySql?
Nie chodzi mi o Redis storage które ma wbudowane.

Mam w bazie tabelę z odwiedzinami. Chciałbym te odwiedziny zbierać do Redis i co np. 1 min aktualizować rekordy w BD.

Mogę sobie ręcznie pchać do Redis w odpowiednie klucze a potem cron wykonał by jakiś command do opróżnienia i dodania do MySql,
ale zastanawiam się czy jest jakis bardziej cywilizowany sposób.
Forti
Resque możesz do tego wykorzystać, czyli po prosty kolejkowanie.

Wówczas ustawiasz workera np. aby co minutę nasłuchiwał redisa na nowe rekordu - jeżeli są to je zapisuje.
Pyton_000
Kowalski... inne opcje ? smile.gif
kayman
nie ma innych opcji -> albo wykorzystasz cron albo napiszesz usługę/workera odpytującego redis
freemp3
Musi to być konkretnie co każdą minutę?

Mógłbyś np. dodać do redis czas ostatniego zapisu do bazy danych i przy aktualizacji odwiedzin sprawdzać, czy upłyneła minuta. Jeśli tak robisz zapis do bazy i aktualizujesz czas w redis smile.gif
Forti
Kowalski... co? Tylko nie mów że nie ogarniesz tongue.gif
Pyton_000
@freemp3 nie mus, ale odwiedzin jest kilka tyś na min, a one znowu są do statystyk brane, więc uznałem że 1 min to optymalne rozwiązanie
Zamiast tego czasu raczej myslałem żeby po prostu czyścić zawartość kluczy zaktualizowanych.
Czyli coś na zasadzie redis_pop() -> update_db

Nowe odwiedziny dalej by się dodawały

@Forti Ogarnięcie to nie jakiś straszny problem smile.gif Zajmie to 100 lat ale co tam haha.gif
by_ikar
W redisie bodajże od wersji 2.6 wprowadzili coś takiego jak keyspace i keyevent: http://redis.io/topics/notifications działa to w skrócie tak, że możesz sobie pod konkretną operacje (np set, del, get etc), lub przestrzeń klucza (działają asteriksy np klucz* ) podpiąć jakąś funkcje. W ten sposób nie w bezpośrednim "wątku" ale w innym procesie możesz wydelegować wykonywanie czegoś, czego nie koniecznie byś chciał wykonać w "wątku" gdzie user zapisuje jakieś dane. Wtedy redis jest taką super szybką warstwą pośredniczącą. Nie pika ci coś w tle w cronie, nie listujesz wszystkich danych z redisa (listowanie co minutę kilkuset tysięcy rekordów i ich obrabianie? tia..). Takiego workera mógłbyś napisać w kilkunastu linijkach w node.js i puścić żeby sobie gdzieś tam chodził.

Minusem takiego workera jest to że jest SPOF, bo jeżeli padnie, to danych ci nie wrzuci do bazy, odpalenie dwóch takich workerów jest średnio możliwe, bo by duplikowałyby swoje zadania, chyba że byś im dopisał jakąś kolejkę (zapis/odczyt do redisa co aktualny worker robi, żeby drugi proces tego nie duplikował) to wtedy możesz uruchomić klaster takich workerów z jakimś managerem który by restartował danego workera jeżeli by mu się padło.

Kwestia tego, czy ty tego potrzebujesz ?
Pyton_000
Rozwiązania są interesujące.

Nie mniej to nie będzie finalnie kilka tyś rekordów / min.
Chyba jednak zostanie cron jako rozwiązanie trywialne.

Aplikacja nie posiada żadnego zaplecza z node.js więc musiałbym specjalnie to uruchamiać na serwerze.

Ale trzeba będzie się zainteresować tymi eventami bo wygląda ciekawie.
by_ikar
Aktualnie korzystam w jednej aplikacji z tych eventów i moim zdaniem jest to killer feature względem memcached. Można robić z tym ciekawe rzeczy, np jak sesja użytkownika którego trzymasz w redisie wygaśnie i dopiero wtedy kiedy wygaśnie, a nie sprawdzanie tego czasowo lub w jakiejś pętli.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.