Programavimas

Kaip naudoti „Redis“ matavimo programoms realiuoju laiku

Roshanas Kumaras yra „Redis Labs“ vyresnysis produktų vadovas.

Matavimas nėra tik paprasta skaičiavimo problema. Matavimas dažnai painiojamas su matavimu, tačiau paprastai tai yra daugiau. Matavimas apima matavimą, tačiau kaip nuolatinį procesą, paprastai siekiant reguliuoti išteklių naudojimą ar srautą laikui bėgant. Šiuolaikinėse programose matavimas atliekamas įvairiais būdais, pradedant žmonių, objektų ar įvykių skaičiavimu, baigiant naudojimo reguliavimu, prieigos valdymu ir pajėgumų paskirstymu.

Matavimo sprendimai paprastai turi apdoroti didelius duomenų kiekius, laikydamiesi griežtų našumo reikalavimų. Priklausomai nuo sprendimo masto, skaičiavimas ir matavimas gali apimti tūkstančius, o ne milijonus duomenų bazės atnaujinimų kiekvieną sekundę. Pagrindiniai duomenų bazės reikalavimai, palaikantys tokį sprendimą, yra didelis pralaidumas rašymo operacijoms ir mažas (po milisekundžių) atsakymų vėlavimas.

„Redis“, atvirojo kodo atminties duomenų bazės platforma, teikia abu šiuos privalumus, tuo pat metu yra ekonomiškai naudinga naudojant minimalius aparatinės įrangos išteklius. Šiame straipsnyje mes išnagrinėsime tam tikras „Redis“ savybes, dėl kurių tai yra geras pasirinkimas matavimo sprendimams, ir kaip mes galime naudoti „Redis“ šiam tikslui. Bet pirmiausia pažvelkime į kelis dažniausiai pasitaikančius matavimo būdus.

Bendros matavimo programos

Matavimas reikalingas visose programose, kurios turi įvertinti išteklių naudojimą laikui bėgant. Čia yra keturi įprasti scenarijai:

  1. Vartojimu pagrįsti kainodaros modeliai. Skirtingai nuo vienkartinių ar abonentinių mokėjimų modelių, vartojimu pagrįstos kainodaros modeliai leidžia vartotojams mokėti tik už faktinį naudojimą. Vartotojai naudojasi didesniu lankstumu, laisve ir taupo išlaidas, o paslaugų teikėjai labiau išlaiko vartotojus.

    Tokių modelių diegimas gali būti keblus. Kartais matavimo sistema turi stebėti daugelį naudojimo elementų ir daugelį metrikų viename plane. Pavyzdžiui, debesies paslaugų teikėjas gali nustatyti skirtingus kainų lygius procesoriaus ciklams, saugojimui, pralaidumui, mazgų skaičiui ar paslaugos naudojimo trukmei. Telekomunikacijų bendrovė gali nustatyti skirtingus leistino minučių, duomenų ar teksto vartojimo lygius. Matavimo sprendime turi būti nustatytos ribos nustatymo, apmokestinimo ar paslaugų išplėtimo paslaugos, atsižvelgiant į vartojimu pagrįstos kainodaros tipą.

  2. Išteklių naudojimo apribojimas. Kiekviena interneto paslauga gali būti piktnaudžiaujama per daug naudojant, nebent ši paslauga yra ribojama. Dėl šios priežasties populiariose paslaugose, tokiose kaip „Google AdWords“ API ir „Twitter Stream“ API, įvedami tarifų apribojimai. Kai kurie kraštutiniai piktnaudžiavimo atvejai lemia paslaugų atsisakymą (DoS). Siekiant užkirsti kelią piktnaudžiavimui, internete pasiekiamos paslaugos ir sprendimai turi būti kuriami taikant tinkamas tarifų ribojimo taisykles. Net paprasti autentifikavimo ir prisijungimo puslapiai turi apriboti pakartojimų bandymų skaičių tam tikru laiko tarpu.

    Kitas pavyzdys, kai būtina apriboti išteklių naudojimą, yra tai, kad keičiantis verslo reikalavimams pasenusioms sistemoms tenka didesnė apkrova nei jos gali palaikyti. Įkainis, apribojantis skambučius į senas sistemas, leidžia įmonėms prisitaikyti prie augančios paklausos nereikalaujant pakeisti savo senų sistemų.

    Be to, kad būtų išvengta piktnaudžiavimo ir sumažinta apkrova, geras greičio ribojimas taip pat padeda valdyti sprogimo eismo scenarijus. Pavyzdžiui, API, vykdanti grubios jėgos greičio ribojimo metodą, gali leisti 1000 skambučių kas valandą. Neturėdamas eismo formavimo politikos, klientas gali paskambinti API per 1000 kartų per pirmąsias kiekvienos valandos sekundes, galbūt viršydamas tai, ką gali palaikyti infrastruktūra. Populiarūs tarifą ribojantys algoritmai, tokie kaip „Token Bucket“ ir „Leaky Bucket“, užkerta kelią sprogimams ne tik apribodami skambučius, bet ir paskirstydami juos laikui bėgant.

  3. Išteklių paskirstymas. Spūstys ir vėlavimai yra įprasti scenarijai programose, kurios susijusios su paketų nukreipimu, darbo valdymu, eismo spūstimis, minios valdymu, socialinių tinklų pranešimų siuntimu, duomenų rinkimu ir pan. Eilių modeliai siūlo keletą galimybių valdyti eilės dydį, atsižvelgiant į atvykimo ir išvykimo greitį, tačiau įgyvendinti šiuos modelius dideliu mastu nėra lengva.

    Neatsilikimas ir perkrovos yra nuolatinis rūpestis, kai sprendžiami greiti duomenų srautai. Sumanūs dizaineriai turi apibrėžti priimtinus eilės ilgio apribojimus, kartu įtraukdami ir eilių našumo stebėjimą, ir dinamišką maršruto parinkimą pagal eilių dydžius.

  4. Skaičiavimas mastu priimant sprendimus realiuoju laiku. El. Prekybos svetainės, žaidimų programos, socialinė žiniasklaida ir mobiliosios programos pritraukia milijonus kasdienių vartotojų. Kadangi daugiau akių obuolių duoda didesnes pajamas, verslui yra labai svarbu tiksliai skaičiuoti lankytojus ir jų veiksmus. Skaičiavimas yra panašiai naudingas ir tokiems naudojimo atvejams kaip klaidų bandymai, problemų išplėtimas, DDoS atakų prevencija, srauto profiliavimas, išteklių paskirstymas pagal pareikalavimą ir sukčiavimo mažinimas.

Matavimo projektavimo iššūkiai

Sprendimo architektai, kurdami matavimo programą, turi atsižvelgti į daugelį parametrų, pradedant šiais keturiais:

  1. Dizaino sudėtingumas. Duomenų kiekių skaičiavimas, stebėjimas ir reguliavimas - ypač kai jie pasiekia didelį greitį - yra nelengva užduotis. Sprendimo architektai gali valdyti matavimą taikomųjų programų lygmenyje, naudodami programavimo kalbos struktūras. Tačiau toks dizainas nėra atsparus gedimams ar duomenų praradimui. Tradicinės diskų bazės yra tvirtos ir žada didelį duomenų patvarumą gedimų metu. Bet ne tik jie neatitinka reikiamo našumo, bet ir padidina sudėtingumą be tinkamų duomenų struktūrų ir įrankių matavimui įgyvendinti.
  2. Vėlavimas. Matavimas paprastai apima daugybę nuolat atnaujinamų skaičiavimų. Tinklo ir disko skaitymo / rašymo delsimas prisideda prie didelių skaičių. Tai gali sukelti sniego gniūžtę, sukurdami didžiulį duomenų kaupimąsi, dėl kurio vėluojama daugiau. Kitas delsos šaltinis yra programos dizainas, kuris įkelia matavimo duomenis iš duomenų bazės į pagrindinę programos atmintį ir, kai atnaujina skaitiklį, vėl įrašo į duomenų bazę.
  3. Kartu ir nuoseklumas. Sukūrus sprendimą suskaičiuoti milijonus ir milijardus daiktų, gali būti sudėtinga, kai įvykiai fiksuojami skirtinguose regionuose, ir jie visi turi sueiti vienoje vietoje. Duomenų nuoseklumas tampa problema, jei daugelis procesų ar gijų tuo pačiu metu atnaujina tą patį skaičių. Užrakinimo metodais išvengiama nuoseklumo problemų ir užtikrinamas operacijų lygio nuoseklumas, tačiau sulėtinamas sprendimas.
  4. Patvarumas. Matavimas turi įtakos pajamų skaičiui, o tai reiškia, kad trumpalaikės duomenų bazės nėra idealios patvarumo požiūriu. Atmintyje esanti duomenų saugykla su ilgaamžiškumo galimybėmis yra puikus pasirinkimas.

Redis naudojimas matavimo programoms

Tolesniuose skyriuose išnagrinėsime, kaip naudoti „Redis“ skaičiuojant ir matuojant sprendimus. „Redis“ turi įmontuotas duomenų struktūras, atomines komandas ir „time-to-live“ (TTL) galimybes, kurios gali būti naudojamos matavimo energijos vartojimo atvejams. Redis veikia vienu siūlu. Todėl visi duomenų bazės atnaujinimai yra serijiniai, leidžiantys „Redis“ veikti kaip duomenų saugykla be užrakto. Tai supaprastina programos dizainą, nes kūrėjams nereikia skirti jokių pastangų sinchronizuojant gijas ar įgyvendinant fiksavimo mechanizmus, kad duomenys būtų nuoseklūs.

„Atomic Redis“ komandos skaičiavimui

„Redis“ teikia komandas vertėms didinti, nereikalaujant jų perskaityti į pagrindinę programos atmintį.

Komandaapibūdinimas
INCR RaktasPadidinkite sveiką rakto vertę vienu
APSAUGOS rakto prieaugisPadidinkite sveiką rakto vertę nurodytu skaičiumi
INCRBYFLOAT rakto prieaugisPadidinkite rakto kintamąją vertę nurodytu dydžiu
DECR RaktasSumažinkite sveiką rakto vertę vienu
NUOLAIKA rakto mažinimasSumažinkite sveiką rakto vertę nurodytu skaičiumi
HINCRBY rakto lauko prieaugisPadidinkite maišos lauko sveikąją vertę nurodytu skaičiumi
HINCRBYFLOAT rakto lauko prieaugisPadidinkite maišos lauko kintamąją vertę nurodytu dydžiu

„Redis“ saugo sveikus skaičius kaip bazinį 10 64 bitų pasirašytą sveikąjį skaičių. Todėl maksimali sveikojo skaičiaus riba yra labai didelis skaičius: 263 - 1 = 9,223,372,036,854,775,807.

„Redis“ klavišuose įmontuotas laikas iki laiko (TTL)

Vienas iš dažniausių matavimo atvejų yra naudojimo stebėjimas pagal laiką ir išteklių ribojimas pasibaigus laikui. Redis'e galima nustatyti raktų gyvavimo laiką. Redis automatiškai išjungs klavišus po nustatyto skirtojo laiko. Šioje lentelėje pateikiami keli raktų galiojimo pabaigos metodai.

Komandaapibūdinimas
TIKRINKITE klavišų sekundėsNustatykite rakto gyvenimo laiką sekundėmis
EXPIREAT pagrindinė laiko žymėNustatykite rakto galiojimo laiką kaip „Unix“ laiko žymę
PEXPIRE raktas milisekundėsNustatykite rakto laiką gyventi milisekundėmis
PEXPIREAT pagrindinė laiko žymėNustatykite rakto galiojimo laiką kaip UNIX laiko žymę milisekundėmis
SET rakto vertė [EX sekundės] [PX milisekundės]Eilutės reikšmę nustatykite į raktą kartu su pasirinktiniu gyvenimo laiku

Žemiau pateiktuose pranešimuose pateikiamas laikas gyventi klavišuose sekundėmis ir milisekundėmis.

Komandaapibūdinimas
TTL RaktasGaukite laiko gyventi už raktą
PTTL RaktasGaukite laiko gyventi už raktą milisekundėmis

Redis duomenų struktūras ir komandas efektyviam skaičiavimui

„Redis“ yra mėgstamas dėl savo duomenų struktūrų, tokių kaip sąrašai, rinkiniai, rūšiuojami rinkiniai, maišos ir hiperlogai. Daug daugiau galima pridėti per „Redis“ modulių API.

„Redis Labs“

„Redis“ duomenų struktūros yra su įmontuotomis komandomis, kurios yra optimizuotos vykdyti maksimaliai efektyviai atmintyje (ten, kur saugomi duomenys). Kai kurios duomenų struktūros padeda pasiekti daug daugiau nei objektų skaičiavimas. Pavyzdžiui, rinkinio duomenų struktūra garantuoja visų elementų unikalumą.

Rūšiuotas rinkinys žengia dar daugiau žingsnio užtikrindamas, kad į rinkinį būtų įtraukti tik unikalūs elementai, ir leidžiant jums užsisakyti elementus pagal balą. Pavyzdžiui, užsisakę elementus pagal laiką „Surūšiuoto rinkinio“ duomenų struktūroje, pasiūlysite laiko eilučių duomenų bazę. Redis komandų pagalba galite gauti elementus tam tikra tvarka arba ištrinti elementus, kurių jums nebereikia.

„Hyperloglog“ yra dar viena speciali duomenų struktūra, apskaičiuojanti milijonų unikalių daiktų skaičių, nereikia saugoti pačių objektų ar paveikti atminties.

Duomenų struktūraKomandaapibūdinimas
SąrašasLLEN RaktasGaukite sąrašo ilgį
NustatytiŠLAPAS RaktasGaukite narių skaičių rinkinyje (kardinalumas)
Rūšiuotas rinkinysZCARD RaktasGaukite narių skaičių surūšiuotame rinkinyje
Rūšiuotas rinkinysZLEXCOUNT raktas min. maksSkaičiuokite narių skaičių surūšiuotame rinkinyje tarp nurodyto leksikografinio diapazono
HashasHLEN RaktasGaukite lauke maišos maišų skaičių
HiperloglogasPFCOUNT RaktasGaukite apytikslį rinkinio kardinalumą, kurį stebi „Hyperloglog“ duomenų struktūra
BitmapBITCOUNT klavišas [pradžios pabaiga]Skaičiuoja nustatytus bitus eilutėje

Redis atkaklumą ir atminties replikaciją

Matavimo naudojimo atvejai, pvz., Mokėjimai, apima verslui svarbios informacijos saugojimą ir atnaujinimą. Duomenų praradimas daro tiesioginę įtaką pajamoms. Tai taip pat gali sunaikinti atsiskaitymo įrašus, kurie dažnai yra laikymosi ar valdymo reikalavimai.

„Redis“ galite suderinti nuoseklumą ir ilgaamžiškumą atsižvelgdami į savo duomenų reikalavimus. Jei jums reikia nuolatinio matavimo duomenų įrašo įrodymo, ilgaamžiškumą galite pasiekti naudodamiesi „Redis“ atkaklumo galimybėmis. „Redis“ palaiko AOF (tik „append“ failas), kuris nukopijuoja rašymo komandas į diską, kai jos įvyksta, ir „snapshotting“, kuris perima duomenis tuo metu, kai jie egzistuoja, ir įrašo juos į diską.

Įmontuota „Redis“ architektūra be užrakinimo

Redis apdorojimas yra vieno sriegio; tai užtikrina duomenų vientisumą, nes visos rašymo komandos yra automatiškai serijinės. Ši architektūra atleidžia kūrėjus ir architektus nuo naštos sinchronizuoti siūlus daugiagijėje aplinkoje.

Populiarios mobiliosios programos atveju tūkstančiai, o kartais ir milijonai vartotojų vienu metu gali naudotis programa. Tarkime, programa matuoja sunaudotą laiką, o du ar daugiau vartotojų vienu metu gali dalytis minutėmis. Lygiagrečios gijos gali atnaujinti tą patį objektą, neapkraunant papildomos naštos užtikrinant duomenų vientisumą. Tai sumažina programos dizaino sudėtingumą, tuo pačiu užtikrinant greitį ir efektyvumą.

Redis matavimo pavyzdžių diegimas

Pažvelkime į pavyzdinį kodą. Keli iš toliau pateiktų scenarijų reikalautų labai sudėtingo įgyvendinimo, jei naudojama duomenų bazė nebūtų Redis.

Užblokuoti kelis bandymus prisijungti

Siekiant užkirsti kelią neteisėtai prieigai prie paskyrų, svetainės kartais užblokuoja vartotojus kelis kartus bandyti prisijungti per nustatytą laikotarpį. Šiame pavyzdyje apribojame naudotojų bandymus prisijungti daugiau nei tris kartus per valandą, naudojant paprastą „time-to-live“ funkciją.

Raktas, skirtas laikyti bandymų prisijungti skaičių:

vartotojo_prisijungimo_ bandymai:

Veiksmai:

Gaukite dabartinį bandymų skaičių:

GAUTI vartotojo_prisijungimo_ bandymus:

Jei null, tada nustatykite raktą su galiojimo laiku sekundėmis (1 valanda = 3600 sekundžių):

NUSTATYTI vartotojo_prisijungimo_ bandymus: 1 3600

Jei ne null ir jei skaičius yra didesnis nei 3, tada meskite klaidą:

Jei ne nulinis ir jei skaičius yra mažesnis arba lygus 3, padidinkite skaičių:

INCR vartotojo_prisijungimo_ bandymai:

Sėkmingai bandant prisijungti, raktą galima ištrinti taip:

DEL vartotojo prisijungimo bandymai:

Mokėkite eidami

„Redis Hash“ duomenų struktūra suteikia paprastas komandas naudojimui ir atsiskaitymui stebėti. Tarkime, kad šiame pavyzdyje kiekvieno kliento atsiskaitymo duomenys yra saugomi „Hash“, kaip parodyta toliau:

kliento atsiskaitymas:

naudojimas

išlaidos

     .

     .

Tarkime, kad kiekvienas vienetas kainuoja du centus, o vartotojas sunaudojo 20 vienetų. Naudojimo ir atsiskaitymo atnaujinimo komandos yra šios:

hincrby klientas: naudojimas 20

hincrbyfloat klientas: kaina .40

Kaip jau pastebėjote, jūsų programa gali atnaujinti duomenų bazės informaciją nereikalaudama, kad ji įkeltų duomenis iš duomenų bazės į savo atmintį. Be to, galite modifikuoti atskirą „Hash“ objekto lauką, neskaitydami viso objekto.

Atkreipkite dėmesį: šio pavyzdžio tikslas yra parodyti, kaip naudoti hincrby ir hincrbyfloat komandos. Tinkamo dizaino išvengsite nereikalingos informacijos, tokios kaip naudojimas ir kaina, saugojimo.

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