Programavimas

Sukurkite bendrą talpyklos paslaugą, kad pagerintumėte našumą

Tarkime, bendradarbis jūsų paprašys visų pasaulio šalių sąrašo. Kadangi nesate geografijos ekspertas, naršote po Jungtinių Tautų svetainę, atsisiųsite sąrašą ir atsispausdinsite jai. Tačiau ji nori tik išnagrinėti sąrašą; ji iš tikrųjų to nepasiima su savimi. Kadangi paskutinis dalykas, ko jums reikia, yra kitas popieriaus gabalas ant jūsų stalo, sąrašą pateikiate smulkintuvui.

Po dienos kitas bendradarbis prašo to paties: kiekvienos pasaulio šalies sąrašo. Prakeikdami, kad nelaikote sąrašo, vėl naršote po Jungtinių Tautų svetainę. Apsilankę šioje svetainėje pastebite, kad JT kas šešis mėnesius atnaujina savo šalių sąrašą. Jūs atsisiųsite ir atsispausdinsite savo kolegos sąrašą. Jis pažvelgia į tai, dėkoja jums ir vėl palieka sąrašą su jumis. Šį kartą pateikite sąrašą pridedamame pranešime „Post-it“, primenančiame jį išmesti po šešių mėnesių.

Tikrai, per ateinančias kelias savaites jūsų kolegos toliau prašo sąrašo vėl ir vėl. Sveikinate save padavus dokumentą, nes dokumentą iš dokumentų spintos galite išgauti greičiau nei iš interneto. Jūsų kartotekos koncepcija įsitvirtina; netrukus visi pradeda dėti daiktus į jūsų spintelę. Norėdami išvengti spintelės neorganizacijos, nustatykite jos naudojimo gaires. Eidamas savo oficialias pareigas kaip kartotekos vedėjas, nurodote savo bendradarbiams ant visų dokumentų uždėti etiketes ir „Post-it“ užrašus, kuriuose nurodomi dokumentai ir jų išmesti / galiojimo laikas. Etiketės padeda jūsų bendradarbiams surasti ieškomą dokumentą, o „Post-it“ užrašai nustato, ar informacija yra atnaujinta.

Dokumentų spintelė tampa tokia populiari, kad netrukus joje negalėsite pateikti jokių naujų dokumentų. Jūs turite nuspręsti, ką išmesti ir ką laikyti. Nors išmetate visus dokumentus, kurių galiojimo laikas pasibaigęs, spintelė vis tiek perpildyta popieriumi. Kaip nuspręsti, kuriuos neištrintus dokumentus išmesti? Ar išmesti seniausią dokumentą? Galite išmesti rečiausiai naudojamus arba rečiausiai naudojamus; abiem atvejais jums reikės žurnalo, kuris būtų nurodytas, kai buvo pasiektas kiekvienas dokumentas. Arba galbūt nuspręsite, kuriuos dokumentus atmesti, remdamasis kitu veiksniu; sprendimas yra grynai asmeninis.

Norėdami susieti pirmiau minėtą realaus pasaulio analogiją su kompiuterių pasauliu, dokumentų spinta veikia kaip talpykla: didelės spartos atmintis, kurią kartais reikia prižiūrėti. Talpykloje esantys dokumentai yra talpykloje saugomi objektai, visi jie atitinka jūsų nustatytus standartus, talpyklos tvarkyklė. Talpyklos valymo procesas vadinamas valymas. Kadangi talpyklos elementai išvalomi praėjus tam tikram laiko tarpui, talpykla vadinama a laiko talpykla.

Šiame straipsnyje sužinosite, kaip sukurti 100 procentų gryną „Java“ talpyklą, kurioje anoniminė foninė gija bus išvalyta pasibaigusiems elementams. Jūs suprasite, kaip sukurti tokią talpyklą, suprasdami kompromisus, susijusius su įvairiais dizainais.

Sukurkite talpyklą

Užtenka dokumentų kabineto analogijų: pereikime prie svetainių. Svetainių serveriai taip pat turi spręsti talpyklą. Serveriai pakartotinai gauna informacijos užklausas, kurios yra identiškos kitoms užklausoms. Norėdami atlikti kitą užduotį, turite sukurti interneto programą vienai didžiausių pasaulio kompanijų. Po keturių mėnesių kūrimo, įskaitant daugybę bemiegių naktų ir per daug „Jolt colas“, programa yra išbandoma su 1000 vartotojų. Po 5000 vartotojų sertifikavimo testo ir vėlesnio 20 000 vartotojų gamybos išleidimo seka kūrimo bandymai. Tačiau gavę atminties klaidų, kai tik 200 vartotojų išbando programą, kūrimo bandymai sustoja.

Norėdami sužinoti našumo pablogėjimo šaltinį, naudokite profiliavimo produktą ir sužinokite, kad serveris įkelia kelias duomenų bazės kopijas Rezultato rinkinyss, kurių kiekvienas turi po kelis tūkstančius įrašų. Įrašai sudaro produktų sąrašą. Be to, produktų sąrašas yra identiškas kiekvienam vartotojui. Sąrašas nepriklauso nuo vartotojo, kaip galėjo nutikti, jei produktų sąrašas atsirado dėl parametruojamos užklausos. Greitai nusprendžiate, kad viena sąrašo kopija gali būti naudojama visiems vienu metu esantiems vartotojams, todėl ją talpinate.

Tačiau kyla daugybė klausimų, kurie apima tokius sudėtingumus:

  • Ką daryti, jei pasikeis produktų sąrašas? Kaip gali pasibaigti talpyklos sąrašų galiojimo laikas? Kaip sužinoti, kiek laiko produktų sąrašas turėtų likti talpykloje, kol baigsis jo galiojimo laikas?
  • Ką daryti, jei yra du skirtingi produktų sąrašai ir abu sąrašai keičiasi skirtingais intervalais? Ar galiu pasibaigti kiekvieno sąrašo galiojimo laikas atskirai, ar jų visų galiojimo laikas turi būti vienodas?
  • Ką daryti, jei talpykla tuščia ir du užklausos dalyviai bando talpyklą tuo pačiu metu? Ar jiems abiem atrodant tuščia, jie susikurs savo sąrašus ir tada abu bandys įdėti savo kopijas į talpyklą?
  • Ką daryti, jei daiktai ištisus mėnesius sėdi talpykloje be jų? Ar jie nesuvalgys atminties?

Norėdami išspręsti šias problemas, turite sukurti programinės įrangos talpyklos paslaugą.

Pagal dokumentų kartono analogiją žmonės ieškodami dokumentų visada pirmiausia patikrino spintelę. Jūsų programinė įranga turi įgyvendinti tą pačią procedūrą: prieš įkeldami naują sąrašą iš duomenų bazės, užklausa turi patikrinti talpyklos paslaugą. Kaip programinės įrangos kūrėjas, jūs turite prieiti prie talpyklos prieš prieigą prie duomenų bazės. Jei produktų sąrašas jau buvo įkeltas į talpyklą, tada naudokite talpykloje esantį sąrašą, jei jo galiojimo laikas nepasibaigęs. Jei produktų sąrašo nėra talpykloje, įkelkite jį iš duomenų bazės ir nedelsdami talpinkite.

Pastaba: Prieš pereinant prie talpyklos paslaugos reikalavimų ir kodo, galbūt norėsite patikrinti žemiau esančią šoninę juostą „Talpyklos talpinimas prieš sujungimą“. Tai paaiškina telkimas, susijusi sąvoka.

Reikalavimai

Laikydamasis gerų projektavimo principų, apibrėžiau talpyklos paslaugos reikalavimų sąrašą, kurį sukursime šiame straipsnyje:

  1. Bet kuri „Java“ programa gali pasiekti talpyklos paslaugą.
  2. Objektus galima įdėti į talpyklą.
  3. Objektus galima išgauti iš talpyklos.
  4. Talpykloje saugomi objektai gali nustatyti patys, kai pasibaigia jų galiojimo laikas, taip suteikiant maksimalų lankstumą. Talpyklos paslaugos, kurių galiojimo laikas baigiasi visiems objektams, naudojant tą pačią galiojimo formulę, negali optimaliai naudoti talpykloje saugomų objektų. Šis metodas nėra pakankamas didelio masto sistemose, nes, pavyzdžiui, produktų sąrašas gali keistis kasdien, o parduotuvių vietų sąrašas gali keistis tik kartą per mėnesį.
  5. Fono gija, vykdoma pagal žemą prioritetą, pašalina talpykloje esančius objektus, kurių galiojimo laikas baigėsi.
  6. Talpyklos paslauga vėliau gali būti patobulinta naudojant mažiausiai neseniai naudojamą (LRU) arba rečiausiai naudojamą (LFU) valymo mechanizmą.

Įgyvendinimas

Norėdami patenkinti 1 reikalavimą, mes naudojame 100 proc. Gryną „Java“ aplinką. Teikdamas visuomenei gauti ir rinkinys metodus talpyklos paslaugoje, mes taip pat įvykdome 2 ir 3 reikalavimus.

Prieš tęsdamas 4 reikalavimo aptarimą, trumpai paminėsiu, kad mes patenkinsime 5 reikalavimą sukurdami anoniminę giją talpyklos tvarkyklėje; ši gija prasideda statiniame bloke. Be to, mes tenkiname 6 reikalavimą nustatydami taškus, kuriuose vėliau bus pridėtas kodas įgyvendinant LRU ir LFU algoritmus. Toliau straipsnyje aprašysiu išsamiau apie šiuos reikalavimus.

Dabar grįžkime prie 4 reikalavimo, kuriame viskas tampa įdomu. Jei kiekvienas talpykloje saugomas objektas turi pats nustatyti, ar jo galiojimo laikas pasibaigęs, tuomet turite turėti galimybę paklausti objekto, ar jo galiojimo laikas baigėsi. Tai reiškia, kad visi talpyklos objektai turi atitikti tam tikras taisykles; tai pasiekiate „Java“ diegdami sąsają.

Pradėkime nuo taisyklių, kurios valdo talpykloje įdėtus objektus.

  1. Visuose objektuose turi būti viešasis metodas, vadinamas isExpired (), kuri grąžina Bulio reikšmę.
  2. Visi objektai turi turėti viešą metodą, vadinamą „getIdentifier“ (), kuris pateikia objektą, kuris išskiria objektą iš visų kitų talpykloje esančių objektų.

Pastaba: Prieš pereidami tiesiai į kodą, turite suprasti, kad talpyklą galite įdiegti įvairiais būdais. Radau daugiau nei keliolika skirtingų įgyvendinimų. „Enhydra“ ir „Caucho“ teikia puikius išteklius, kuriuose yra keli talpyklos diegimai.

Šio straipsnio talpyklos paslaugos sąsajos kodą rasite 1 sąraše.

Sąrašas 1. „Cacheable.java“

/ ** * Pavadinimas: Talpykla Aprašymas: Ši sąsaja apibrėžia metodus, kuriuos turi įgyvendinti visi objektai, norintys būti talpykloje. * * Autorių teisės: Autorinės teisės (c) 2001 * Įmonė: JavaWorld * Failo pavadinimas: Cacheable.java @author Jonathan Lurie @version 1.0 * / viešoji sąsaja laikoma talpykloje {/ * Reikalaujant, kad visi objektai nustatytų savo galiojimo laiką, algoritmas abstrahuojamas iš talpyklos paslauga, tokiu būdu užtikrinant maksimalų lankstumą, nes kiekvienas objektas gali pritaikyti skirtingą galiojimo pabaigos strategiją. * / viešasis loginis yra baigtas (); / * Šis metodas užtikrins, kad talpyklos paslauga nebūtų atsakinga už unikalų talpykloje esančių objektų identifikavimą. * / public objektas getIdentifier (); } 

Bet koks į talpyklą įdėtas objektas - a Stygos, pavyzdžiui - turi būti suvyniotas objekte, kuris įgyvendina Talpykloje sąsaja. 2 sąrašas yra bendrosios pakavimo klasės, vadinamos, pavyzdys „CachedObject“; joje gali būti bet koks objektas, kurį reikia įdėti į talpyklos tarnybą. Atkreipkite dėmesį, kad ši vyniojimo klasė įgyvendina Talpykloje sąsaja, apibrėžta 1 sąraše.

Sąrašas 2. „CachedManagerTestProgram.java“

/ ** * Pavadinimas: Talpinimas * Aprašymas: Bendrasis talpyklos objekto paketas. Įdiegia talpyklą palaikančią sąsają * „CacheObject“ galiojimo laikui naudoti „TimeToLive“ statistiką. * Autorių teisės: Autorinės teisės (c) 2001 * Įmonė: JavaWorld * Failo pavadinimas: CacheManagerTestProgram.java * @author Jonathan Lurie * @version 1.0 * / viešosios klasės „CachedObject“ įgyvendina talpyklą {// +++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ / * Šis kintamasis bus naudojamas nustatyti, ar objekto galiojimo laikas baigėsi. * / privatus java.util.Dex dateofExpiration = null; privataus objekto identifikatorius = null; / * Čia yra tikroji „vertė“. Tai objektas, kuriuo reikia dalytis. * / public Object object = null; // ++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++ public CachedObject (Object obj, Object id, int minutesToLive) {this.object = obj; this.identifier = id; // minutesToLive iš 0 reiškia, kad jis gyvena neribotą laiką. if (minutesToLive! = 0) {dateofExpiration = nauja java.util.Date (); java.util.Calendar cal = java.util.Calendar.getInstance (); cal.setTime (data ofExpiration); cal.add (cal.MINUTE, minutesToLive); dateofExpiration = cal.getTime (); }} // ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++ public Boolean isExpired () {// Atminkite, kad jei minutės, kurias reikia nugyventi, yra lygios nuliui, tada ji gyvena amžinai! jei (dateofExpiration! = null) {// palyginama galiojimo data. jei (dateofExpiration.before (nauja java.util.Date ())) {System.out.println ("CachedResultSet.isExpired: pasibaigė talpyklos galiojimo laikas! EXPIRE TIME:" + dateofExpiration.toString () + "CURRENT TIME:" + ( nauja java.util.Date ()). toString ()); grįžti tiesa; } else {System.out.println ("CachedResultSet.isExpired: Nebegalioja iš talpyklos!"); grąžinti klaidingą; }} else // Tai reiškia, kad jis gyvena amžinai! grąžinti klaidingą; } // +++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++ public Object getIdentifier () {return identifier; } // +++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++ 

„CachedObject“ klasė atskleidžia konstruktoriaus metodą, kuriam reikalingi trys parametrai:

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

Toliau pateiktoje lentelėje aprašomi šie parametrai.

„CachedObject“ konstruktoriaus parametrų aprašymai
vardasTipasapibūdinimas
ObjObjektasBendras objektas. Jis apibrėžiamas kaip objektas, užtikrinantis maksimalų lankstumą.
IdObjektasId yra unikalus identifikatorius, kuris išskiria obj parametras iš visų kitų talpykloje esančių objektų. Talpyklos paslauga nėra atsakinga už talpykloje esančių objektų unikalumo užtikrinimą.
minutesToLiveVidMinučių skaičius obj parametras galioja talpykloje. Taikant šią priemonę, talpyklos paslauga interpretuoja nulinės vertės reikšmę, kad objektas niekada nesibaigia. Galbūt norėsite pakeisti šį parametrą tuo atveju, jei objektų galiojimo laikas baigsis greičiau nei per vieną minutę.

Konstruktoriaus metodas nustato objekto galiojimo laiką talpykloje naudodamas a laikas gyventi strategija. Kaip rodo jo pavadinimas, laikas iki gyvenimo reiškia, kad tam tikras objektas turi nustatytą laiką, kurio pabaigoje jis laikomas mirusiu. Pridedant minutesToLive, konstruktorius tarpt parametru, iki dabartinio laiko, skaičiuojama galiojimo data. Šis galiojimo laikas priskiriamas klasės kintamajam Galiojimo data.

Dabar isExpired () metodas turi tiesiog nustatyti, ar Galiojimo data yra prieš arba po dabartinės datos ir laiko. Jei data yra ankstesnė už dabartinį laiką ir laikoma, kad talpykloje saugomas objektas yra pasibaigęs, isExpired () metodas grąžina true; jei data yra po dabartinio laiko, talpykloje saugomo objekto galiojimo laikas nesibaigia ir isExpired () grąžina klaidingą. Zinoma jeigu Galiojimo data yra niekinis, kas būtų tuo atveju, jei minutesToLive buvo nulis, tada isExpired () metodas visada pateikia klaidingą, nurodydamas, kad talpykloje saugomas objektas gyvena amžinai.

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