Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Cache - jak, czym, kiedy
nospor
post 22.08.2012, 10:48:33
Post #1





Grupa: Moderatorzy
Postów: 36 429
Pomógł: 6289
Dołączył: 27.12.2004




Tematów o cache było sporo, jednak nie było jednego ogólnego, gdzie by były zawarte ogólne wskazówki.

Zapraszam do dyskusji


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mrWodoo
post 22.08.2012, 17:39:30
Post #2





Grupa: Zarejestrowani
Postów: 160
Pomógł: 6
Dołączył: 13.01.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Ok to pierwsze pytanie, własne czy gotowe rozwiązanie?
Ja do projektu wybrałem własne, a oparłem je na obiektach cache'u. Tzn mam klasę 'reprezentant', która zawiera właności jak
CODE
timeout - ile s. po creationTime (patrz niżej) cache staje się 'przeterminowany'
creationTime - unixowy czas kiedy cache został utworzony
cacheData - dane cache'a

metoda
isTimeout() - zwraca true jesli cache jest 'przeterminowany' lub false jesli nie
get( wlasnosc ) - zwraca jedna z wlasnosci, ktorej nazwa zaczyna sie od `_`, zeby nie pisac metod getCreationTime, getCacheData itd.



mam też klasę 'menedżer', która służy do tworzenia cache'a i wczytywania oraz usuwania. klasa kompletnie statyczna
metody
  1. create( nazwa, dane, timeout )
  2. i ta metoda tworzy obiekt klasy 'reprezentant' i następnie w postaci ZSERIALIZOWANEJ zapisuje go do katalogu Storage/Cache/$nazwa.php
  3.  
  4. read( nazwa ) - wiadome co robi, wczytuje (sprawdza czy istnieje najpierw) plik cache'u z zserializowanym obiektem, przywracam go do 'obiektowej' postaci poprzez unserialize i zwracam (ofc. jeszcze sprawdzenie czy to co chcę zwrócić, to jest instancja klasy 'reprezentant')
  5.  
  6. delete( nazwa ) wiadome
  7.  
  8. init() - sprawdza uprawnienia i rzuca wyjątkami ^^



klasy mają nazwy angielskie, ale to nie ma znaczenia.


zastanawiałem się nad cache'em w bazie, to samo co wyżej, tylko zamiast w pliku to obiekt zapisany w bazie ale jakoś mnie to nie przekonuje.

Ten post edytował mrWodoo 22.08.2012, 17:40:33


--------------------
Go to the top of the page
+Quote Post
erix
post 23.08.2012, 10:00:49
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Ok to pierwsze pytanie, własne czy gotowe rozwiązanie?
Ja do projektu wybrałem własne, a oparłem je na obiektach cache'u. Tzn mam klasę 'reprezentant', która zawiera właności jak

Bardziej istotna jest logika, która zarządza przetrzymywaniem i wykorzystywaniem obiektów niż same obiekty.

Cytat
zastanawiałem się nad cache'em w bazie, to samo co wyżej

W jakim celu? Bo ja jakoś sensu nie dostrzegam. tongue.gif

Cytat
tylko zamiast w pliku to obiekt zapisany w bazie ale jakoś mnie to nie przekonuje.

I słusznie. Po co katować bazę, skoro można trzymać np. w pamięci RAM?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mrWodoo
post 23.08.2012, 10:14:19
Post #4





Grupa: Zarejestrowani
Postów: 160
Pomógł: 6
Dołączył: 13.01.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


a o MemCache pierwsze słyszę, z tym że, cache jest wtedy tracony przy restarcie systemu/serweru a czasami NAPRAWDĘ ważne i unikatowe rzeczy mogą być w cache'u, więc będzie trzeba zaimpletmentować drugi typ cachea


--------------------
Go to the top of the page
+Quote Post
erix
post 23.08.2012, 11:41:16
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cache nie jest po to, żeby coś przechowywać. Jeśli masz takie założenie, że jest storagem, przeprojektuj aplikację, bo są błędne założenia.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mrWodoo
post 23.08.2012, 12:34:16
Post #6





Grupa: Zarejestrowani
Postów: 160
Pomógł: 6
Dołączył: 13.01.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Ok, nie ma innego sposobu na MemCache w PHP oprócz rozszerzenia Memcache(d)?


--------------------
Go to the top of the page
+Quote Post
erix
post 23.08.2012, 12:37:07
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Masz jeszcze shm dostępne w akceleratorach.

Z tą różnicą, że każda instancja interpretera (np. kilka responderów z FastCGI), to każdy z nich posiada osobną pulę cache'u.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
starach
post 24.08.2012, 22:48:40
Post #8





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


A nie da się zrobić z pamięci wirtualnego katalogu i przechowywać w nim plików? Czy to po prostu będzie wolniejsze niż MemCache?
Go to the top of the page
+Quote Post
lukaskolista
post 27.08.2012, 08:07:31
Post #9





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


Memcache to nie tylko przechowywanie danych w pamieci, to takze ich hierarchizacja, dane czesciej wykorzystywane (odczytywane) sa wyzer w hierarchi, natomiast dane najrzadziej wykorzystywane sa najnizej. Jezeli pamiec przeznaczona na cache sie konczy, to podczas zapisu nowych danych do cache'u dane, ktore sa najnizej w hierarchii sa usuwane tak, aby nie przekroczyc limitu pamieci. To jedna z zalet memcache, moze ma tez inne.
Go to the top of the page
+Quote Post
erix
post 27.08.2012, 10:23:34
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
A nie da się zrobić z pamięci wirtualnego katalogu i przechowywać w nim plików?

Da się (ramdrive). Tylko że to jest rozwiązanie uzależnione od stricte jednej maszyny.

Cytat
To jedna z zalet memcache, moze ma tez inne.

Skalowalność, możliwość uniezależnienia od maszyny (ergo: rozbisz klaster z memcached, który działa na maszynach ze słabymi CPU, bez HDD, z systemem ładowanym z Sieci).


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mrWodoo
post 27.08.2012, 15:01:31
Post #11





Grupa: Zarejestrowani
Postów: 160
Pomógł: 6
Dołączył: 13.01.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


czy każdy serwer z linuxem ma MemCache? np taki hosting z webd czy też ma, bo mam XAMPPA (niestety, muszę przez jakiś czas pod Windowsem pracować) i już XAMPP nie ma memcache ;(


--------------------
Go to the top of the page
+Quote Post
d3ut3r
post 28.08.2012, 04:18:59
Post #12





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


Na Windows również możesz zainstalować memcache.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
erix
post 28.08.2012, 12:02:44
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
czy każdy serwer z linuxem ma MemCache?

Może mieć. Natomiast rzadko który hosting coś takiego posiada. Na dedyku sobie bez problemu doinstalujesz, natomiast na współdzielonych chyba tylko linuxpl.com udostępnia.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
wizu
post 2.09.2012, 15:22:24
Post #14





Grupa: Zarejestrowani
Postów: 127
Pomógł: 15
Dołączył: 16.02.2008
Skąd: Sanok

Ostrzeżenie: (0%)
-----


Tak dla uściślenia, to zamiast memcache lepiej postawić sobie memcached. To są dwa różne systemy i trochę różnią się od siebie.

Ten post edytował wizu 2.09.2012, 22:10:32
Go to the top of the page
+Quote Post
murwazy
post 8.09.2012, 11:53:24
Post #15





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 13.04.2007
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


Cytat(erix @ 28.08.2012, 13:02:44 ) *
Może mieć. Natomiast rzadko który hosting coś takiego posiada. Na dedyku sobie bez problemu doinstalujesz, natomiast na współdzielonych chyba tylko linuxpl.com udostępnia.

http://www.megiteam.pl/ ofetuje apc i memcache na hostingach wspoldzielonych
Go to the top of the page
+Quote Post
babejsza
post 1.12.2013, 18:10:52
Post #16





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


Hej,

pytanie do osób, które mają do czynienia na co dzień z cachowaniem, w szczególności z cachowaniem wyników zapytań. Wiem, że ten temat nie jest jednoznaczny więc i sama odpowiedź może być trudna, ale może ktoś pracuje w podobnej specyfice baz i jego doświadczenia będą bardzo pomocne.

Mianowicie w obecnej strukturze aplikacji posiadamy w bazie około 180 tabel o całkowitym rozmiarze ~20GB i objętości około 50 mln rekordów. Aplikacja jest narzędziem "ERP'owym" chodź ma szersze zastosowania niż te wynikające z definicji ERP, bo posiada modułu komunikacyjne, księgowe, kadrowe, zarządcze itp. Do tej pory jedyne cachowanie jakie było stosowane to cache dotyczący opcode, ale w związku z coraz bardziej rozszerzającą się bazą danych staje przed nami zadanie rozważenia i ew. wprowadzenia cachowania wyników zapytań do bazy.

Dla mnie największym problemem czy raczej pytaniem jest kwestia rozsądnego zarządzania cache. W tej chwili korzystamy z AWS aplikacja stoi wraz z bazą i storage na jednej instancji medium. Na razie nie chcę tego za bardzo zmieniać bo chciałbym zobaczyć co pod względem wydajności można wyciągnąć z takiej konfiguracji. Oczywiście można postawić odrębne instancje tylko pod bazę i odrębnie kolejne pod cache, ale nie o to mi chodzi.

To co od samego początku projektowania aplikacji było bardzo istotne to dostęp do najświeższych danych. Czyli ktoś wprowadza np. dokument do bazy a ktoś inny ma do niego od razu dostęp - to samo tyczy się wynikających z tego danych zarządczych. Takich dokumentów pojawi się w bazie około 5 tys. dziennie. Piszę o tym bo to dobrze zobrazuje jedne z moich problemów czyli to, że jeżeli nawet (upraszczam proces na potrzeby tego przykładu) będę zapisywał do cache wynik zapytania dotyczących dokumentów klienta to co kilka sekund przy dodawaniu nowego rekordu musiałbym ten wpis nadpisywać.

Drugą kwestią jest to, że ze względu na duże skomplikowanie systemu uprawnień i flag w samej bazie, każdy user odpytując bazę z tymi dokumentem wysyła inne zapytanie (różnią się niewiele, ale wystarczająco, żeby była potrzeba tworzenia nowych kluczy dla cache).

Czyli łącząc dwa powyższe problemy robi nam się sytuacja gdzie stosując cache dla zapytań INSERT, UPDATE, SELECT, DELETE dotyczących tej konkretnej tabeli co kilka sekund nadpisują się setki zapisanych w cache pozycji, a każda z nich niesie tak na prawdę tysiące rekordów.

No i tu to pytanie do Was, jak z Waszej praktyki powinno to wyglądać? Czy nie powinienem się przejmować i takie cachowanie pozostaje w granicach dozwolonych praktyk i mimo wszystko będzie wpływało pozytywnie na zasoby systemowe (tj. dzięki cache spadnie zapotrzebowanie na nie względem tego samego, ale pracującego na samej bazie). Albo może jednak to nie jest dobr praktyka i powinienem się w przypadku cache ograniczyć tylko do tych zasobów bazy danych które są w miarę statyczne (np. dane useów, klientów, kontrahentów) tj. dane które rzadko kiedy się aktualizuje, kasuje czy dodaje nowe.

Jeżeli chodzi o sam mechanizm do cachowania najprawdopodobniej będziemy się skupiać na APC. Wygląda na to, że w kwestii cachowania danych jest on porównywalny z memcached natomiast dużo lepiej sprawuje się w przypadku opcode, a dodatkowo ma się stać częścią php więc jako rozwiązanie natywne będzie łatwiejsze z zarządzaniu i ew. elastyczniejsze przy migracjach.

Z góry dzięki za podjęcie tematu i ew. dyskusję wink.gif. Mam nadzieję, że dobrze zobrazowałem problemy smile.gif.

Ten post edytował babejsza 2.12.2013, 00:32:27
Go to the top of the page
+Quote Post
phpion
post 5.12.2013, 12:17:26
Post #17





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Moim zdaniem jeśli do systemu bardzo często trafiają nowe dane, a wymogiem jest to by prezentowane dane zawsze były aktualne to nie ma tu miejsca na cache. Sam widzisz jakie problemy będzie to generować.

PS: Cache dla INSERT, UPDATE, DELETE? smile.gif
Go to the top of the page
+Quote Post
ano
post 6.01.2014, 22:15:23
Post #18





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


@babejsza - Ok, ale w czym dokładnie problem?
Jaka to baza? (Jeśli mysql to innodb czy myisam?)

- Zapycha Wam się baza danych? Za dużo transakcji/s do bazy? --> macie ją odpaloną w replikacji (master/master ew. slave)?
- Zapytania są za wolne?
--- JOINY ->Denormalizacja wink.gif (tak tak, w erp moźe być niemożliwe, ale za mało info żeby coś sensowniej napisać)
--- Używacie funkcji db? County, sumy, date cokolwiek?

Cytat
jako rozwiązanie natywne będzie łatwiejsze z zarządzaniu i ew. elastyczniejsze przy migracjach.


W jakim sensie łatwiejsze do zarządzania? W przypadku apc nie bedziecie mieli praktycznie żadnej możliwości przy jego zarządzaniu.
Elastyczniejsze przy migracjach? W jakim sensie? Cache będziecie musieli mieć przecież na tej samej maszynie co aplikacja, nie będzie żadnej możliwości jego migracji na inny serwer.

Nie idzcie w APC, dla takiego zastosowania się nie sprawdzi.

Zainteresuj się Redisem (nie ma sensu aktualnie iść na memcache). Zapewni Wam o wiele większe możliwości administracyjne, HA i świetny jako zwykły, trwały storage. A pod wzgl. wydajnościowym - 100.000 req/s powinno Wam wystarczyć wink.gif

Cacheowanie w tego typu aplikacjach może mijać się z celem z tych powodów które wypunktowałeś - konieczność natychmiastowego dostępu do świeżych danych.
Najpierw zoptymalizujcie aktualną DB, zprofilujcie aplikację a potem ew. migracja części danych na Redisa.


--------------------
Linkedin | ...
Go to the top of the page
+Quote Post
babejsza
post 7.01.2014, 10:10:02
Post #19





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


@phpion - zabrakło przecina po "cache". Chodziło to co się będzie działo z cache po operacjach CRUD wink.gif.

@ano - problem jest bardziej teoretyczny. Chciałem ew. podyskutować odnośnie teorii i ew. Waszych praktyk.

Co do APC miałem na myśli fakt, że będzie ono za chwilę częścią PHP więc nie trzeba będzie dbać o doinstalowywanie go jako biblioteki. Niby szczegół, ale przy migracjach (migracji całego systemu do np. innej chmury) tych szczegółów są dziesiątki więc każdy jeden mniej robi różnicę wink.gif. O redisie nie słyszałem wcześniej - dzięki, poczytam.

Optymalizacja kodu, baz itd. to kwestia oczywista, tak jak pisałem bardziej mi chodzi o teoretyczną dyskusję, po części ew. potwierdzenie moich odczuć odnośnie wykorzystania rożnych technologii czy im zaprzeczenie. Upraszczając cały mój wcześniejszy wpis pytanie sprowadza się do: czy stosować cache zapytań gdy potrzeba nam bezpośredniego dostępu do najświeższych danych.
Go to the top of the page
+Quote Post
cepa
post 25.01.2014, 15:52:50
Post #20





Grupa: Zarejestrowani
Postów: 125
Pomógł: 7
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


Cytat(babejsza @ 1.12.2013, 18:10:52 ) *
...


Pierwsze co weź pod rozwagę to czy potrzebujesz SQL? Czy korzystasz z transakcji? Czy potrzebujesz izolacji? Czy robisz locki na zasobach, itd itp? Jeżeli NIE, to zmień storage na NoSQL i przy takiej bazie nie idz w Mongo tylko Apache Cassandra. Z drugiej strony jak często potrzebujesz odczytywać dane i grzebac w warstwie persistence? Oraz jakie operacje wykonujesz? Czy robisz dużo sortowań? Czy masz tabele z milionami rekordów i potrzebujesz wyciągać spore porcje danych? Czy raczej operujesz w obrębie rekordu. Jezeli dużo operacji na zbiorach to SQL jest jednak prostszy w użyciu.

Zakładając, że trzymasz się SQL, to sorry ale "cachowanie" to proteza, która działa może przy blogu lub forum ale nie w systemie ERP. Polecam zainteresować się modelem CQRS (Command Query Responsibility Segregation), dodatkowo tematyka MOM (Message Oriented Middleware). Twój problem jest prosty do rozwiązania przykładowo za pomocą takiej architektury:

- operacje odczytu (Query / SELECT / HTTP GET) serwujesz z przygotowanego (cache) kontentu
- jezeli nie masz tego kontentu w cache to dany call jest zamieniany w Command i leci dalej czekając na wynik
- operacje zapisu (Command / INSERT, UPDATE, DELETE / HTTP POST, PUT, DELETE) odkladasz na kolejke (MQ) - pozwoli to kontrolowac przepływ i ilośc transakcji względem warstwy persistence
- komendy są zdejmowane z kolejki przez aktorów, którzy wykonują logike biznesową i generują wynik, zapisując go także w warstwie o niskim czasie dostępu (cache, np: memcache, redis, cassandra)

Mniej więcej taki proces powoduje, że dopoki aplikacja nie potrzebuje zmienić swojego stanu, nie ma potrzeby dotykać powolnej bazy danych, z drugiej strony eliminuje problemy z zapychaniem dostępu do bazy. Jest jeszcze jeden mega plus: zauważ, że jeżeli w kolejce masz więcej niż jedną operacje zapisu TEGO SAMEGO REKORDU, to możesz zdjąc z kolejki WSZYSTKIE starsze operacje i zapisać tylko najnowszy stan. W ten sposób mozna zmniejszyć ilośc transakcji w aplikacji, bez wpływu na generowane wyniki.



--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 06:59