Amuyt’añäni, mä sistema ukanx apnaqirinakax qillqatanakamp yapxatapxi. Sapa apnaqiritakix, jupanakan qillqatanakapat estadísticas uñacht’ayapxtwa tablón personal ukan: qawqha qillqatanakas utji, promedio de palabras, frecuencia de publicación, ukat juk’ampinaka Sistema jank’ak lurañatakix aka datos ukanakax caché ukanw uñacht’ayasi. Sapa yatiyawitakix mä sapa caché llave ukaw lurasi.
Jiskt’awix uñstawayiwa: kunjamas ukham cachés ukanakax jan chiqapar uñjatäspa kunapachatix datos ukanakax mayjt’ki ukhaxa? Mä amtawix sapa lurawitak caché ukax amparamp q’umachañawa, sañäni, kunapachatix machaq qillqatax yapxatatäki ukhaxa:
class InvalidateArticleReportCacheOnArticleCreated { public function handle(event: ArticleCreatedEvent): void { this->cacheService->deleteMultiple([ 'user_article_report_count_' . event->userId, 'user_article_report_word_avg_' . event->userId, 'user_article_report_freq_avg_' . event->userId, ]) } }
Aka lurawix irnaqaskiwa ukampis walja yatiyawinakamp llavenakamp apasiñax ch’amäxiwa. Akax kawkhantix etiquetado caching ukax wali askiwa. Caching etiquetado ukax datos ukax janiw mä llave ukampikiti jan ukasti mä matriz de etiquetas ukampiw uñt’ayasi. Ukxarusti, taqi qillqatanakax mä etiqueta específica ukamp chikt’ataw jan chiqapar uñjatäspa, ukax lurawix wali ch’amanchatawa.
Mä valor qillqt’aña caché ukar etiquetas ukanakampi:
this->taggedCacheService->set( key: 'user_article_report_count_' . user->id, value: value, tagNames: [ 'user_article_cache_tag_' . user->id, 'user_article_report_cache_tag_' . user->id, 'user_article_report' ] )
Caché ukax etiquetas ukanakamp jan walt’ayaña:
class UpdateCacheTagsOnArticleCreated { public function handle(event: ArticleCreatedEvent): void { this->taggedCacheService->updateTagsVersions([ 'user_article_cache_tag_' . user->id, ]) } }
Akax, 'user_article_cache_tag_' . $user->id
apnaqirin qillqatanakapan mayjt’awinakap uñacht’ayi. Ukax kuna cachés uka datos ukarjam jan walt’ayañatakiw apnaqasispa. Mä juk’amp chiqapa uñt’ayawi 'user_article_report_cache_tag_' . $user->id
ukax apnaqirin yatiyawinakap q’umachañapatakiw jayti, ukampirus mä jach’a etiqueta 'user_article_report'
taqi apnaqirinakatak yatiyäw cachés ukarux jan chiqaw sañ muni.
Biblioteca de caché ukax jan etiquetado ukar yanapt’kchi ukhax juma pachpaw phuqhasma. Jilïr amuyux jichha versión valores de etiquetas ukanakax imañawa, ukhamarak sapa valores etiquetados ukanakatakix, etiquetas versión ukanakax jichha pachan utjkän uka pachan valores ukanakax caché ukar qillqt’atäki ukanak imañataki. Ukatxa, kunapachatix mä valor caché ukan apsutäki ukhax jichha etiqueta versión ukanakax apsutarakiwa, ukatx chiqapar uñjatapax uñakipt’atarakiwa.
Mä TaggedCache
clase luraña
class TaggedCache { private cacheService: cacheService }
Etiquetas ukanakampi caché ukar qillqañatakix set
método ukar phuqhaña. Aka lurawinxa, jiwasaxa qillqañasawa valores ukaxa caché ukaru, ukhamaraki apsuñatakixa jichha versión ukanakaxa etiquetas ukanakaxa churatarakiwa ukatxa imañarakiwa asociadas a la clave específica de caché. Ukax mä yaqha llave ukamp mä prefijo ukamp yapxatatawa, ukax churat llave ukar yapxatatawa.
class TaggedCache { private cacheService: cacheService public function set( key: string, value: mixed, tagNames: string[], ttl: int ): bool { if (empty(tagNames)) { return false } tagVersions = this->getTagsVersions(tagNames) tagsCacheKey = this->getTagsCacheKey(key) return this->cacheService->setMultiple( [ key => value, tagsCacheKey => tagVersions, ], ttl ) } private function getTagsVersions(tagNames: string[]): array<string, string> { tagVersions = [] tagVersionKeys = [] foreach (tagNames as tagName) { tagVersionKeys[tagName] = this->getTagVersionKey(tagName) } if (empty(tagVersionKeys)) { return tagVersions } tagVersionsCache = this->cacheService->getMultiple(tagVersionKeys) foreach (tagVersionKeys as tagName => tagVersionKey) { if (empty(tagVersionsCache[tagVersionKey])) { tagVersionsCache[tagVersionKey] = this->updateTagVersion(tagName) } tagVersions[$tagName] = tagVersionsCache[tagVersionKey] } return tagVersions } private function getTagVersionKey(tagName: string): string { return 'tag_version_' . tagName } private function getTagsCacheKey(key: string): string { return 'cache_tags_tagskeys_' . key }
get
uka thakhi yapxataña, ukhamat etiquetado valores ukanakax caché ukan apsuñataki. Aka tuqinxa, llave apnaqasa valor apsusipxta, ukhamaraki uka llavempi chikt’ata etiqueta versión ukanaka. Ukatxa, uka chimpunakax chiqati janicha uk uñakipt’araktanwa. Kawkïr etiquetas jan walïkchi ukhaxa, valorax caché ukanx chhaqtayatawa ukatx null
ukax kutt’ayatarakiwa. Taqi etiquetas ukanakax wali askiwa, ukax caché ukan chimpunakaparux kutt’ayatarakiwa.
class TaggedCache { private cacheService: cacheService public function get(key: string): mixed { tagsCacheKey = this->getTagsCacheKey(key) values = this->cacheService->getMultiple([key, tagsCacheKey]) if (empty(values[key]) || empty(values[tagsCacheKey])) { return null } value = values[key] tagVersions = values[tagsCacheKey] if (! this->isTagVersionsValid(tagVersions)) { this->cacheService->deleteMultiple([key, tagsCacheKey]) return null } return value } private function isTagVersionsValid(tagVersions: array<string, string>): bool { tagNames = array_keys(tagVersions) actualTagVersions = this->getTagsVersions(tagNames) foreach (tagVersions as tagName => tagVersion) { if (empty(actualTagVersions[tagName])) { return false } if (actualTagVersions[tagName] !== tagVersion) { return false } } return true } }
updateTagsVersions
uka lurawi phuqhaña, etiqueta versión ukanaka machaqar tukuyañataki. Aka chiqanx, taqi etiquetas ukanakax churatäki ukanakaruw iteratapxta ukatx versión ukanakap machaqar tukuyapxta, sañäni, jichha pachax versión ukham apnaqasa.
class TaggedCache { private cacheService: cacheService public function updateTagsVersions(tagNames: string[]): void { foreach (tagNames as tagName) { this->updateTagVersion(tagName) } } private function updateTagVersion(tagName: string): string { tagKey = this->getTagVersionKey(tagName) tagVersion = this->generateTagVersion() return this->cacheService->set(tagKey, tagVersion) ? tagVersion : '' } private function generateTagVersion(): string { return (string) hrtime(true) } }
Aka amuyt’awix wali askiwa, taqinitakis ukhamarakiwa. Caching etiquetado ukax chhaqtayiw manualmente taqi llaves ukanakax invalidación ukar uñt’ayaña, automáticamente proceso. Ukampirus yaqha yänak munaraki: etiqueta versión ukan yatiyawinak imaña ukat sapa mayiwimp chika chiqapar uñjaña.
Servicio de caché ukax jank’akiw ukat janiw sinti jach’a jark’atäkiti, aka amtawix janiw sinti lurawinakx jan walt’aykaniti. Uka carga jisk’achañatakixa, etiquetado caché ukampi mecanismos locales de caché ukampiwa mayachasispa.
Ukhamatwa, caching etiquetado ukax janiw invalidación ukakikiti jan ukasti datos ukamp irnaqañax juk’amp flexible ukhamarak amuyañjamawa, juk’ampirus sistemas complejos ukanx walja datos interconectados ukanakanx.