Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Redis][Doctrine] Cachowanie danych z BD
Forum PHP.pl > Forum > PHP > Frameworki
daniel1302
Witam, mam u siebie w aplikacji taką politykę:
Mam standardowo encje do tabelek i do większości encji mam zrobione repozytoria. Jak wiadomo czasem trzeba zrobić coś bardziej optymalnie, napisać jakieś zapytanie łączące itp.

Teraz zakładam, że mam moduł statystyk czegoś tam. Taki moduł jest korzysta z repozytorium StatisticRepository, wyświetla on dane statystyczne w kilku miejscach na portalu.
Zakładamy, że nie mogę zrobić np serwisu bo dane są inaczej prezentowane a mało tego w niektórych miejscach trzeba je dodatkowo przeliczyć/zmodyfikować.

I teraz dwa pytania:
1) Jak robicie cachowanie danych u was? Mam dwa podejścia:
a ) W każdym kontrolerze cachuje już wyjściowe dane tzn jeśli jest w cache to tylko pobieram i wypluwam wyniki na ekran. Jest to szybsze do tego co chcę zrobić lecz mniej wygodne.
b ) Dla mnie wygodniejsze było by zacachowanie danych bezpośrednio pobranych z BD i potem w kontrolerze wywolywac np metode $statsRepository->getSomeDataWithCache(...);
I tutaj aby rozwiązanie było elastyczne powinienem mieć CacheInterface który pozwala mi na użycie dowolnego mechanizmu cachowania np pliku txt/xml/json..., czy tam mojego redisa czy innego dowolnego rozwiązania.
Ale jako, że korzystam tylko i wyłącznie z redisa lepiej to przekazywałbym jako 1-szy parametr obiekt PRedis.

Dane są potrzebne w wielu miejscach i wyciągnięcie danych zajmuje 0.5 sekundy a przeliczenie jest kilka set razy szybsze.

Czy takie rozwiązanie jak w podpunkcie b jest dobre? Czy można wyłuskać obiekt redisa?

2) Gdzie umieszczacie klasy modeli np mam model statystyk który wykonuje obliczenia statystyczne, dodatkowo mam model TreeMaxtix który wykonuje obliczenia i operacje na macierzach reprezentujących drzewa itp...
Czy jeśli umieszczę to w Entity/Model to jest to jakoś rażące? Mam kilka 5/6 modeli.
kpt_lucek
Odnośnie 2):
src/MojBundle/Entity
src/MojBundle/Model

Niejako Entity jest modelem, aczkolwiek używasz go pośrednio do komunikacji z bazą, w przypadku modelu, może być to zwykły DTO bez innego zastosowania jak reprezentacja danych w formie obiektowej.

Odnośnie 1)

Z tego co wiem to Doctrine ma mechanizm do cacheowania, tutaj możesz poczytać jak to jest zaimplementowane i używane przez Doctrine z użyciem Redisa.

Jak to robię u siebie? Wszystko zależy od projektu, typu danych, potrzeb biznesowych. Czasami interesuje Cię tylko i wyłącznie wynik, bo część logiczna jest wykonywana cyklicznie (np. CRON), w innym wypadku potrzebujesz cacheować obiekty, bo wyciągnięcie ich zajmuje (jak u Ciebie) dużo czasu.
lukaskolista
1 b
użyj wzorca proxy i takie proxy ustaw jako dekorator usługi repozytorium

2) Rozważ taką opcję, aby za obliczenia były odpowiedzialne usługi. Nie powiem Ci co konkretnie masz zrobić, bo wszystko zależy od kontekstu słowa "obliczenia".
daniel1302
Dziekuje jak będę miał chwilkę to poszukam jakichś rozwiązań zgodnie z waszymi sugestiami
pyro
To zabawne to czytać, gdy właśnie stworzyłem bibliotekę do tego przeznaczoną:

http://forum.php.pl/index.php?showtopic=252008
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.