Programmēšana

Izstrādājiet vispārēju kešatmiņas pakalpojumu, lai uzlabotu veiktspēju

Pieņemsim, ka darbabiedrs jums prasa visu pasaules valstu sarakstu. Tā kā jūs neesat ģeogrāfijas eksperts, jūs pārlūkojat ANO vietni, lejupielādējat sarakstu un viņai to izdrukājat. Tomēr viņa vēlas tikai izskatīt sarakstu; viņa to patiesībā neņem līdzi. Tā kā pēdējā lieta, kas jums nepieciešama, ir vēl viens papīrs uz jūsu rakstāmgalda, jūs pabarojat sarakstu smalcinātājā.

Dienu vēlāk cits kolēģis pieprasa to pašu: visu pasaules valstu sarakstu. Lamājot sevi par to, ka neturat sarakstu, jūs atkal pārlūkojat Apvienoto Nāciju vietni. Šajā tīmekļa vietnes apmeklējumā jūs atzīmējat, ka ANO ik pēc sešiem mēnešiem atjaunina savu valstu sarakstu. Jūs lejupielādējat un izdrukājat sava kolēģa sarakstu. Viņš to aplūko, pateicas jums un atkal atstāj sarakstu ar jums. Šoreiz saraksts tiek aizpildīts, pievienojot ziņojumu Post-it piezīmei, kas atgādina jums to izmest pēc sešiem mēnešiem.

Protams, nākamajās nedēļās jūsu kolēģi turpina pieprasīt sarakstu atkal un atkal. Jūs apsveicat sevi ar dokumenta iesniegšanu, jo dokumentu var izņemt no kartotēkas ātrāk, nekā to var iegūt no vietnes. Jūsu kartotēkas koncepcija aizrauj; drīz visi sāk ievietot priekšmetus jūsu kabinetā. Lai novērstu skapīša dezorganizāciju, jūs iestatāt vadlīnijas tā lietošanai. Jūsu amatā kā kartotēkas vadītājs, jūs uzdodat saviem kolēģiem uz visiem dokumentiem ievietot etiķetes un piezīmes Post-it, kas identificē dokumentus un viņu izmetšanas / derīguma termiņu. Etiķetes palīdz jūsu kolēģiem atrast meklēto dokumentu, un piezīmes Post-it nosaka, vai informācija ir atjaunināta.

Kartotēka kļūst tik populāra, ka drīz jūs tajā nevarēsit iesniegt jaunus dokumentus. Jums jāizlemj, ko izmest un ko paturēt. Kaut arī jūs izmetat visus dokumentus, kuriem beidzies derīguma termiņš, kabinets joprojām tiek pārpildīts ar papīru. Kā izlemt, kurus neizmantotos dokumentus izmest? Vai jūs izmetat vecāko dokumentu? Jūs varētu izmest vismazāk izmantotās vai vismazāk izmantotās; abos gadījumos jums būs nepieciešams žurnāls, kas norādīts, kad tika piekļūts katram dokumentam. Vai varbūt jūs varētu izlemt, kurus dokumentus izmest, pamatojoties uz kādu citu faktoru; lēmums ir tīri personisks.

Lai saistītu iepriekš minēto reālās pasaules līdzību ar datoru pasauli, lietu skapis darbojas kā kešatmiņa: ātrgaitas atmiņa, kurai laiku pa laikam nepieciešama apkope. Kešatmiņā esošie dokumenti ir kešatmiņā saglabāti objekti, kas visi atbilst jūsu noteiktajiem standartiem, kešatmiņas pārvaldnieks. Kešatmiņas tīrīšanas process tiek saukts attīrīšana. Tā kā kešatmiņā saglabātie vienumi tiek notīrīti pēc noteikta laika, kešatmiņu sauc par a laika cache.

Šajā rakstā jūs uzzināsiet, kā izveidot 100% tīru Java kešatmiņu, kas izmanto anonīmu fona pavedienu, lai notīrītu vienumus, kuru derīguma termiņš ir beidzies. Jūs redzēsiet, kā veidot šādu kešatmiņu, vienlaikus izprotot dažādu dizainu kompromisus.

Izveidojiet kešatmiņu

Pietiekami daudz dokumentu skapju analoģiju: pārejam uz vietnēm. Vietņu serveriem ir jārisina arī kešatmiņa. Serveri atkārtoti saņem informācijas pieprasījumus, kas ir identiski citiem pieprasījumiem. Nākamajam uzdevumam ir jāizveido interneta lietojumprogramma vienam no pasaules lielākajiem uzņēmumiem. Pēc četru mēnešu izstrādes, ieskaitot daudzas bezmiega naktis un pārāk daudz Jolt kolu, lietojumprogramma tiek testēta ar 1000 lietotājiem. Pēc izstrādes testēšanas seko 5000 lietotāju sertifikācijas pārbaude un vēlāka 20 000 lietotāju ražošanas izlaišana. Tomēr pēc atmiņas kļūdu saņemšanas, kamēr lietojumprogrammu testē tikai 200 lietotāji, izstrādes pārbaude tiek apturēta.

Lai noteiktu veiktspējas pasliktināšanās avotu, izmantojiet profilēšanas produktu un atklājiet, ka serveris ielādē vairākas datu bāzes kopijas ResultSets, no kuriem katram ir vairāki tūkstoši ierakstu. Ieraksti veido produktu sarakstu. Turklāt produktu saraksts katram lietotājam ir identisks. Saraksts nav atkarīgs no lietotāja, kā tas varētu būt gadījumā, ja produktu saraksts būtu radies parametrizēta vaicājuma rezultātā. Jūs ātri izlemjat, ka viena saraksta kopija varētu apkalpot visus vienlaicīgi lietotājus, tāpēc jūs to kešatmiņā.

Tomēr rodas vairāki jautājumi, kas ietver šādas sarežģītības:

  • Ko darīt, ja mainās produktu saraksts? Kā kešatmiņai var beigties saraksti? Kā es uzzināšu, cik ilgi produktu sarakstam vajadzētu palikt kešatmiņā, pirms tā termiņš beidzas?
  • Ko darīt, ja pastāv divi atšķirīgi produktu saraksti un abi saraksti mainās dažādos intervālos? Vai var beigties katra saraksta derīguma termiņš atsevišķi, vai visiem tiem jābūt vienādam derīguma termiņam?
  • Ko darīt, ja kešatmiņa ir tukša un divi pieprasītāji izmēģina kešatmiņu tieši vienlaikus? Kad viņi abi to uzskata par tukšu, vai viņi izveidos savus sarakstus un pēc tam abi mēģinās ievietot kopijas kešatmiņā?
  • Ko darīt, ja vienumi mēnešiem ilgi atrodas kešatmiņā bez piekļuves? Vai viņi neēdīs atmiņu?

Lai risinātu šīs problēmas, jums jāveido programmatūras kešatmiņas pakalpojums.

Lietu skapīša līdzībā cilvēki, meklējot dokumentus, vienmēr vispirms pārbaudīja skapi. Jūsu programmatūrai jāievieš tā pati procedūra: pieprasījumam jāpārbauda kešatmiņas pakalpojums, pirms tiek ielādēts jauns saraksts no datu bāzes. Kā programmatūras izstrādātājs jūsu pienākums ir piekļūt kešatmiņai pirms piekļuves datu bāzei. Ja produktu saraksts jau ir ielādēts kešatmiņā, izmantojiet kešatmiņā saglabāto sarakstu, ja tam nav beidzies derīguma termiņš. Ja produktu saraksts nav kešatmiņā, tad to ielādējat no datu bāzes un nekavējoties kešatmiņā.

Piezīme: Pirms kešatmiņas pakalpojuma prasību un koda ievērošanas, iespējams, vēlēsities apskatīt zemāk esošo sānjoslu "Kešatmiņa versus apvienošana". Tas izskaidro apvienošana, saistītu jēdzienu.

Prasības

Saskaņā ar labiem dizaina principiem es definēju kešatmiņas pakalpojuma prasību sarakstu, kuru izstrādāsim šajā rakstā:

  1. Kešatmiņas pakalpojumam var piekļūt jebkura Java lietojumprogramma.
  2. Objektus var ievietot kešatmiņā.
  3. Objektus var iegūt no kešatmiņas.
  4. Kešatmiņā saglabātie objekti var noteikt paši, kad beidzas to derīguma termiņš, tādējādi nodrošinot maksimālu elastību. Kešatmiņas pakalpojumi, kuru derīguma termiņš beidzas visiem objektiem, izmantojot to pašu derīguma formulu, nespēj nodrošināt kešatmiņā saglabāto objektu optimālu izmantošanu. Šī pieeja nav piemērota liela mēroga sistēmās, jo, piemēram, produktu saraksts var mainīties katru dienu, savukārt veikalu vietu saraksts var mainīties tikai reizi mēnesī.
  5. Fona pavediens, kas darbojas zemas prioritātes gadījumā, noņem kešatmiņā saglabātos objektus, kuru derīguma termiņš ir beidzies.
  6. Kešatmiņas pakalpojumu var uzlabot vēlāk, izmantojot vismazāk izmantoto (LRU) vai vismazāk izmantoto (LFU) attīrīšanas mehānismu.

Īstenošana

Lai izpildītu 1. prasību, mēs pieņemam 100% tīru Java vidi. Nodrošinot sabiedrību gūt un komplekts metodes kešatmiņas pakalpojumā, mēs izpildām arī 2. un 3. prasību.

Pirms turpināt 4. prasības apspriešanu, es īsi pieminēšu, ka mēs izpildīsim 5. prasību, izveidojot anonīmu pavedienu kešatmiņas pārvaldniekā; šis pavediens sākas statiskajā blokā. Mēs arī izpildām 6. prasību, nosakot punktus, kur vēlāk tiks pievienots kods, lai ieviestu LRU un LFU algoritmus. Es sīkāk par šīm prasībām iedziļināšos vēlāk rakstā.

Tagad atgriezīsimies pie 4. prasības, kur lietas kļūst interesantas. Ja katram kešatmiņā ievietotajam objektam pašam jānosaka, vai tā derīguma termiņš ir beidzies, jums ir jābūt iespējai jautāt objektam, vai tam ir beidzies derīguma termiņš. Tas nozīmē, ka visiem kešatmiņā esošajiem objektiem jāatbilst noteiktiem noteikumiem; jūs to paveicat Java, ieviešot saskarni.

Sāksim ar noteikumiem, kas regulē kešatmiņā ievietotos objektus.

  1. Visiem objektiem jābūt publiskai metodei, ko sauc isExpired (), kas atgriež Būla vērtību.
  2. Visiem objektiem jābūt publiskai metodei, ko sauc getIdentifier (), kas atgriež objektu, kas atšķir objektu no visiem citiem kešatmiņā.

Piezīme: Pirms pāriet tieši uz kodu, jums jāsaprot, ka kešatmiņu var ieviest daudzos veidos. Esmu atradis vairāk nekā duci dažādu realizāciju. Enhydra un Caucho nodrošina lieliskus resursus, kas satur vairākas kešatmiņas ieviešanas.

Šī raksta kešatmiņas pakalpojuma saskarnes kods ir atrodams 1. sarakstā.

Saraksts 1. Cacheable.java

/ ** * Nosaukums: Kešatmiņa Apraksts: Šī saskarne nosaka metodes, kuras jāievieš visiem objektiem, kuri vēlas ievietot kešatmiņā. * * Autortiesības: Autortiesības (c) 2001 * Uzņēmums: JavaWorld * Faila nosaukums: Cacheable.java @author Jonathan Lurie @version 1.0 * / public interface Cacheable {/ * Prasot visiem objektiem pašiem noteikt derīguma termiņus, algoritms tiek abstrahēts no kešatmiņas pakalpojums, tādējādi nodrošinot maksimālu elastību, jo katrs objekts var pieņemt atšķirīgu derīguma termiņa stratēģiju. * / public boolean isExpired (); / * Šī metode nodrošinās, ka kešatmiņas pakalpojums nav atbildīgs par kešatmiņā ievietoto objektu unikālu identificēšanu. * / public Object getIdentifier (); } 

Jebkurš objekts, kas ievietots kešatmiņā - a Stīga, piemēram, - jāiesaiņo objektā, kas īsteno Kešatmiņā interfeiss. 2. saraksts ir vispārīgas iesaiņošanas klases, ko sauc, piemērs CachedObject; tajā var būt jebkurš objekts, kas nepieciešams ievietot kešatmiņas pakalpojumā. Ņemiet vērā, ka šī iesaiņošanas klase ievieš Kešatmiņā 1. sarakstā definētā saskarne.

Saraksts 2. CachedManagerTestProgram.java

/ ** * Nosaukums: Kešatmiņa * Apraksts: Vispārējs kešatmiņas objektu ietinējs. Īsteno kešatmiņas interfeisu * CacheObject derīguma termiņa beigām izmanto TimeToLive statēģiju. * Autortiesības: Autortiesības (c) 2001 * Uzņēmums: JavaWorld * Faila nosaukums: CacheManagerTestProgram.java * @author Jonathan Lurie * @version 1.0 * / publiskā klase CachedObject īsteno kešatmiņu {// +++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ / * Šis mainīgais tiks izmantots, lai noteiktu, vai objektam ir beidzies derīguma termiņš. * / private java.util.Date dateofExpiration = null; privātā objekta identifikators = null; / * Šeit ir reālā "vērtība". Šis ir objekts, kas ir jādala. * / public Object object = null; // +++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++ public CachedObject (Object obj, Object id, int minutesToLive) {this.object = obj; this.identifier = id; // minutesToLive no 0 nozīmē, ka tas dzīvo bezgalīgi. if (minutesToLive! = 0) {dateofExpiration = jauna java.util.Date (); java.util.Calendar cal = java.util.Calendar.getInstance (); cal.setTime (dateofExpiration); cal.add (cal.MINUTE, minutesToLive); dateofExpiration = cal.getTime (); }} // ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++ publiskā būla vērtība irExpired () {// Atcerieties, ja dzīvojamās minūtes ir nulles, tad tās dzīvo mūžīgi! ja (dateofExpiration! = null) {// tiek salīdzināts derīguma termiņš. if (dateofExpiration.before (new java.util.Date ())) {System.out.println ("CachedResultSet.isExpired: Beidzies no kešatmiņas! EXPIRE TIME:" + dateofExpiration.toString () + "CURRENT TIME:" + ( jauns java.util.Date ()). toString ()); atgriezties taisnība; } else {System.out.println ("CachedResultSet.isExpired: Beidzies ne no kešatmiņas!"); atgriezties nepatiesa; }} else // Tas nozīmē, ka tas dzīvo mūžīgi! atgriezties nepatiesa; } // ++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++ public Object getIdentifier () {atgriešanās identifikators; } // ++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++ 

The CachedObject klase atklāj konstruktora metodi, kurai nepieciešami trīs parametri:

public CachedObject (Object obj, Object id, int minutesToLive) 

Tālāk esošajā tabulā ir aprakstīti šie parametri.

CachedObject konstruktora parametru apraksti
NosaukumsTipsApraksts
ObjObjektsObjekts, kas tiek koplietots. Tas tiek definēts kā objekts, lai nodrošinātu maksimālu elastību.
IdObjektsId satur unikālu identifikatoru, kas atšķir obj parametrs no visiem pārējiem kešatmiņā esošajiem objektiem. Kešatmiņas pakalpojums nav atbildīgs par kešatmiņā esošo objektu unikalitātes nodrošināšanu.
minutesToLiveIntMinūšu skaits, kad obj parametrs ir derīgs kešatmiņā. Šajā ieviešanā kešatmiņas pakalpojums interpretē nulles vērtību, lai objekta derīguma termiņš nekad nebūtu beidzies. Iespējams, vēlēsities mainīt šo parametru, ja objektu derīguma termiņš ir īsāks par vienu minūti.

Konstruktora metode nosaka kešatmiņā esošā objekta derīguma termiņu, izmantojot a laiks dzīvot stratēģiju. Kā norāda nosaukums, laiks dzīvot nozīmē, ka noteiktam objektam ir noteikts laiks, pēc kura beigām tas tiek uzskatīts par mirušu. Pievienojot minutesToLive, konstruktors int Parametra pašreizējam laikam tiek aprēķināts derīguma termiņš. Šis derīguma termiņš tiek piešķirts klases mainīgajam Derīguma termiņš.

Tagad isExpired () metodei vienkārši jānosaka, vai Derīguma termiņš ir pirms vai pēc pašreizējā datuma un laika. Ja datums ir pirms pašreizējā laika un tiek uzskatīts, ka kešatmiņā saglabātā objekta derīguma termiņš ir beidzies, isExpired () metode atgriež true; ja datums ir pēc pašreizējā laika, kešatmiņā saglabātā objekta derīguma termiņš nav beidzies un isExpired () atgriež false. Protams, ja Derīguma termiņš ir nulle, kas būtu gadījumā, ja minutesToLive bija nulle, tad isExpired () method vienmēr atgriež false, norādot, ka kešatmiņā saglabāts objekts dzīvo mūžīgi.

$config[zx-auto] not found$config[zx-overlay] not found