Predmemoriranje slika brojača u memoriji
O sadržaju i njegovoj provjeri
U ovom članku
Gotovo petina slika brojača koje ova usluga iscrtava više ništa ne mijenja. Skripta za praćenje miša iz prethodne generacije ponovno učitava sliku pri svakom pomaku i, otkad ti zahtjevi više ništa ne povećavaju, dva uzastopna daju istu sliku, bajt po bajt.
Očit kandidat za predmemoriju. Zanimljive odluke bile su gdje je postaviti i što staviti u ključ.
Ne na disku
Ovo radi na malom poslužitelju, a disk je SD kartica. Predmemoriranje iscrtanih slika na nju značilo bi otprilike 70 MB upisa dnevno, u zamjenu za izmjerenu uštedu od 1,6 minuta procesorskog vremena dnevno.
To je loš kompromis. SD kartice otkazuju zbog upisivanja, a dobiva se pogreška zaokruživanja na stroju kojem procesor nije usko grlo. Zato se predmemorija nalazi u /dev/shm, što je tmpfs, odnosno RAM. Ondje izmjereno: 0,027 ms za čitanje, 0,036 ms za pisanje, 1,9 GB slobodno.
Sve nestaje pri ponovnom pokretanju. Za predmemoriju to nije gubitak, nego uobičajen slučaj.
Redis radi na istom stroju. Nije korišten iz razloga koji nema veze s tehnologijom: pripada drugoj aplikaciji i za nju je zaštićen lozinkom. Dijeljenje jedne instance povezalo bi dvije nepovezane usluge, pa bi loš dan jedne postao loš dan druge.
Ključ sadržava brojeve
Uobičajen ključ predmemorije identitet je uz rok isteka, a istek je oklada: ništa se važno nije promijenilo u posljednjih pet minuta. Kod brojača ono što se mijenja upravo je ono što se prikazuje.
Zato prikazane vrijednosti idu u ključ. Ako se broj promijeni, ključ je drukčiji i slika se iscrtava iznova. Oklada nestaje umjesto da se pažljivo odigra. Svaki izbrojeni posjet povećava barem ukupni broj od početka, pa nijedan izbrojeni posjet ne može dobiti zastarjelu sliku. Preostali istek samo je gornja granica za vrijednosti koje nisu u ključu — tjedne, mjesečne i godišnje vrijednosti.
Što je trebalo prvo provjeriti
Predmemorija je sigurna samo ako je ono što predmemorira funkcija njezina ključa. To je tvrdnja o svakom dizajnu i provjerena je, a ne pretpostavljena:
- nijedan dizajn ne koristi
rand(),mt_rand(),shuffle()niuniqid() - nijedan dizajn ne čita vrijeme s preciznošću većom od jednog sata
- parametri praćenja iz stare skripte ne čitaju se nigdje u stablu koda
Posljednja provjera donijela je najbolji neuspjeh cijele vježbe. Dok su ti parametri još bili dio ključa, svaki je zahtjev nosio malo drukčije koordinate miša, pa je svaki ključ bio jedinstven. Predmemorija je radila cijeli dan i zabilježila 13 pogodaka. Radila je savršeno, a nije ništa činila, što je najteža vrsta kvara za uočavanje.
A ako išta ovdje zakaže — nečitljiv direktorij, pun disk, oštećen unos — slika se jednostavno iscrtava uobičajeno. Predmemorija nikada ne smije biti razlog da se brojač ne pojavi.