Programiranje

Kako uporabljati Redis za sprotno merjenje

Roshan Kumar je višji produktni vodja v laboratorijih Redis.

Merjenje ni le preprost problem štetja. Merjenje pogosto zamenjujemo z merjenjem, vendar je običajno več kot to. Merjenje sicer vključuje merjenje, vendar kot stalni postopek, običajno s ciljem reguliranja uporabe ali pretoka vira skozi čas. Sodobne aplikacije vključujejo merjenje na različne načine, od štetja ljudi, predmetov ali dogodkov do regulacije uporabe, nadzora dostopa in dodelitve zmogljivosti.

Merilne rešitve morajo na splošno obdelovati velike količine podatkov, hkrati pa izpolnjevati stroge zahteve glede zmogljivosti. Glede na obseg rešitve lahko štetje in merjenje vključuje vsako tisoč, če ne milijone posodobitev baze podatkov vsako sekundo. Primarne zahteve baze podatkov za podporo takšni rešitvi so velika prepustnost za pisanje in nizka (sub-milisekundna) zakasnitev za odgovore.

Redis, odprtokodna platforma baze podatkov v pomnilniku, prinaša obe prednosti, hkrati pa je stroškovno učinkovita v smislu uporabe minimalnih strojnih virov. V tem članku bomo preučili nekatere značilnosti Redisa, zaradi katerih je dobra izbira za merilne rešitve, in kako lahko v ta namen uporabimo Redis. Najprej pa si oglejmo nekaj najpogostejših načinov merjenja.

Pogoste merilne aplikacije

Merjenje je potrebno v vsaki aplikaciji, ki mora meriti porabo vira skozi čas. Tu so štirje pogosti scenariji:

  1. Modeli oblikovanja cen na podlagi porabe. Za razliko od enkratnih ali naročninskih modelov plačevanja modeli cen, ki temeljijo na potrošnji, potrošnikom omogočajo plačilo samo za dejansko uporabo. Potrošniki uživajo večjo prilagodljivost, svobodo in prihranek stroškov, medtem ko ponudniki pridobijo večje zadrževanje potrošnikov.

    Izvajanje takšnih modelov je lahko težavno. Včasih mora merilni sistem v enem načrtu slediti številnim elementom uporabe in številnim meritvam. Ponudnik v oblaku lahko na primer nastavi različne ravni cen za ciklu procesorja, pomnilnik, pretočnost, število vozlišč ali čas uporabe storitve. Telekomunikacijsko podjetje lahko nastavi različne ravni dovoljene porabe minut, podatkov ali besedila. Merilna rešitev mora uveljaviti omejevanje, zaračunavanje ali razširitev storitev, odvisno od vrste cen na podlagi porabe.

  2. Omejevanje uporabe virov. Vsako internetno storitev je mogoče zlorabiti s pretirano uporabo, razen če je ta storitev omejena. Priljubljene storitve, kot sta Google AdWords API in Twitter Stream API, iz tega razloga vključujejo omejitve hitrosti. Nekateri skrajni primeri zlorabe vodijo do zavrnitve storitve (DoS). Da bi preprečili zlorabe, morajo biti storitve in rešitve, ki so dostopne na internetu, zasnovane z ustreznimi pravili za omejevanje hitrosti. Tudi preproste strani za preverjanje pristnosti in prijavo morajo omejiti število ponovitev v določenem časovnem intervalu.

    Drug primer, ko je omejevanje uporabe virov nujno, je spreminjanje poslovnih zahtev večje obremenitve starejših sistemov, kot jih lahko podpirajo. Omejevanje klicev na stare sisteme omogoča podjetjem, da se prilagodijo rastočemu povpraševanju, ne da bi morali zamenjati stare sisteme.

    Dobro preprečevanje zlorab poleg preprečevanja zlorab in zmanjšanja obremenitve pomaga tudi pri upravljanju scenarijev z zastoji v prometu. Na primer, API, ki uveljavi metodo omejevanja stopnje surove sile, lahko dovoli 1000 klicev vsako uro. Brez vzpostavljene politike oblikovanja prometa lahko odjemalec v prvih nekaj sekundah vsake ure API pokliče 1000-krat, morda preseže, kar infrastruktura lahko podpira. Priljubljeni algoritmi za omejevanje hitrosti, kot sta Token Bucket in Leaky Bucket, preprečujejo izbruhe, ne samo da omejijo klice, temveč jih tudi sčasoma porazdelijo.

  3. Porazdelitev virov. Preobremenjenost in zamude so pogosti scenariji v aplikacijah, ki se ukvarjajo z usmerjanjem paketov, upravljanjem delovnih mest, zastoji v prometu, nadzorom množice, sporočanjem v družabnih omrežjih, zbiranjem podatkov itd. Modeli čakalne vrste ponujajo več možnosti za upravljanje velikosti čakalne vrste glede na stopnjo prihoda in odhoda, vendar uporaba teh modelov v velikem obsegu ni enostavna.

    Zaostanki in zastoji so nenehna skrb pri obravnavanju hitrih podatkovnih tokov. Pametni oblikovalci morajo določiti sprejemljive omejitve dolžine čakalne vrste, pri tem pa vključiti tako nadzor učinkovitosti čakalnih vrst kot dinamično usmerjanje na podlagi velikosti čakalnih vrst.

  4. Štetje v obsegu za sprotno odločanje. Spletna mesta za e-trgovino, igralne aplikacije, družabni mediji in mobilne aplikacije privabljajo milijone dnevnih uporabnikov. Ker več očesnih očes prinaša večje prihodke, je štetje obiskovalcev in njihovo natančno delovanje ključnega pomena za poslovanje. Štetje je podobno koristno za primere uporabe, kot so poskusi napak, stopnjevanje težav, preprečevanje napadov DDoS, profiliranje prometa, dodelitev virov na zahtevo in ublažitev goljufij.

Izzivi merilnega oblikovanja

Arhitekti rešitev morajo pri izdelavi merilne aplikacije upoštevati številne parametre, začenši s temi štirimi:

  1. Zapletenost oblikovanja. Štetje, sledenje in uravnavanje količin podatkov - še posebej, če pridejo z veliko hitrostjo - je zastrašujoča naloga. Arhitekti rešitev lahko obvladujejo merjenje na aplikacijski plasti s pomočjo struktur programskega jezika. Vendar takšna zasnova ni odporna na napake ali izgubo podatkov. Tradicionalne zbirke podatkov na disku so robustne in obljubljajo visoko stopnjo trajnosti podatkov med napakami. Toda ne samo, da ne zagotavljajo potrebne zmogljivosti, ampak tudi povečujejo zapletenost brez ustreznih podatkovnih struktur in orodij za izvajanje merjenja.
  2. Latenca. Merjenje običajno vključuje številne, stalne posodobitve štetja. Zakasnitev branja / pisanja v omrežju in na disku se povečuje pri obravnavanju večjih številk. To bi lahko snežno kepo ustvarilo ogromen zaostanek podatkov, kar bi povzročilo večje zamude. Drugi vir zakasnitve je zasnova programa, ki naloži merilne podatke iz baze podatkov v glavni pomnilnik programa in po posodobitvi števca zapiše nazaj v bazo podatkov.
  3. Sočasnost in doslednost. Oblikovanje rešitve za štetje milijonov in milijard predmetov se lahko zaplete, ko se dogodki zajemajo v različnih regijah, in vsi se morajo združiti na enem mestu. Doslednost podatkov postane težava, če več procesov ali niti istočasno posodablja isto število. Tehnike zaklepanja se izognejo težavam z doslednostjo in zagotavljajo doslednost na ravni transakcij, vendar upočasnijo rešitev.
  4. Trajnost. Merjenje vpliva na število prihodkov, kar pomeni, da kratkotrajne zbirke podatkov niso idealne glede trajnosti. Shramba podatkov v pomnilniku z možnostmi trajnosti je odlična izbira.

Uporaba Redisa za merjenje aplikacij

V naslednjih razdelkih bomo preučili, kako uporabljati Redis za rešitve štetja in merjenja. Redis ima vgrajene podatkovne strukture, atomske ukaze in funkcije za čas preživetja (TTL), ki se lahko uporabljajo za napajanje merilnih primerov. Redis deluje na eni niti. Zato so vse posodobitve baze podatkov serializirane, kar Redisu omogoča, da deluje kot zaklenjena shramba podatkov. To poenostavi zasnovo aplikacije, saj razvijalcem ni treba porabiti napora za sinhronizacijo niti ali izvajanje mehanizmov za zaklepanje zaradi doslednosti podatkov.

Atomic Redis ukazi za štetje

Redis ponuja ukaze za povečanje vrednosti, ne da bi jih bilo treba prebrati v glavni pomnilnik aplikacije.

UkazOpis
INCR tipkoPovečajte celoštevilčno vrednost ključa za eno
INCRBY prirastek tipkePovečajte celoštevilčno vrednost ključa za dano število
INCRBYFLOAT prirastek tipkePovečaj plavajočo vrednost ključa za dani znesek
DECR tipkoCeloštevilčno vrednost ključa zmanjšajte za eno
DECRBY zmanjšanje ključaZmanjšajte celoštevilčno vrednost ključa za dano število
HINCRBY prirast ključnega poljaPovečajte celoštevilčno vrednost razpršenega polja za dano število
HINCRBYFLOAT prirast ključnega poljaPovečajte plavajočo vrednost razpršenega polja za dani znesek

Redis shranjuje cela števila kot osnovno 10 64-bitno podpisano celo število. Zato je največja meja za celo število zelo velika: 263 - 1 = 9.223.372.036.854.775.807.

Vgrajen čas za življenje (TTL) na tipkah Redis

Eden najpogostejših primerov uporabe pri merjenju je sledenje uporabi glede na čas in omejevanje virov po izteku časa. V Redisu lahko za ključe nastavite vrednost časa delovanja. Redis bo samodejno onemogočil tipke po nastavljeni časovni omejitvi. Naslednja tabela navaja več načinov veljavnosti ključev.

UkazOpis
IZDELA ključnih sekundNastavite čas ključa, da bo živel v sekundah
IZKUŠNITE ključni časovni žigNastavite veljavnost ključa kot časovni žig Unix
PEXPIRE ključne milisekundeNastavite čas ključa, da živi v milisekundah
PEXPIREAT ključni časovni žigNastavite veljavnost ključa kot časovni žig UNIX v milisekundah
SET vrednost ključa [EX sekunde] [PX milisekunde]Vrednost niza nastavite na ključ skupaj z neobveznim časom za življenje

Spodnja sporočila vam zagotavljajo čas delovanja tipk v sekundah in milisekundah.

UkazOpis
TTL tipkoVzemite si čas za življenje za ključ
PTTL tipkoV milisekundah si zagotovite čas za življenje ključa

Redis podatkovne strukture in ukazi za učinkovito štetje

Redis je všeč zaradi svojih podatkovnih struktur, kot so seznami, nabori, razvrščeni nabori, razpršitve in hiperlogi. Skozi API modulov Redis je mogoče dodati še veliko več.

Redis Labs

Podatkovne strukture Redis imajo vgrajene ukaze, ki so optimizirani za izvajanje z največjo učinkovitostjo v pomnilniku (tam, kjer so podatki shranjeni). Nekatere podatkovne strukture vam pomagajo doseči veliko več kot štetje predmetov. Struktura podatkov Set na primer zagotavlja edinstvenost vseh elementov.

Razvrščeni niz gre še korak dlje, tako da zagotavlja, da so v nabor dodani samo unikatni elementi, in vam omogoča, da elemente razvrstite na podlagi partiture. Če boste na primer razvrstili svoje elemente v strukturi podatkov Sorted Set, boste na primer dobili bazo podatkov s časovnimi vrstami. S pomočjo ukazov Redis lahko svoje elemente dobite v določenem vrstnem redu ali izbrišete predmete, ki jih ne potrebujete več.

Hyperloglog je še ena posebna podatkovna struktura, ki ocenjuje štetje milijonov unikatnih predmetov, ne da bi morali shraniti predmete same ali vplivati ​​na pomnilnik.

Struktura podatkovUkazOpis
SeznamLLEN tipkoDobite dolžino seznama
NastaviteSCARD tipkoPridobite število članov v nizu (kardinalnost)
RazvrščenoZCARD tipkoPridobite število članov v razvrščenem nizu
RazvrščenoZLEXCOUNT tipka min maksŠtejte število članov v razvrščenem naboru med danim leksikografskim obsegom
HashHLEN tipkoPridobite število polj v zgoščeni obliki
HiperlogPFCOUNT tipkoPridobite približno kardinalnost nabora, ki ga opazuje podatkovna struktura Hyperloglog
Bitna slikaBITCOUNT tipka [začetek konec]Šteje nastavljene bite v nizu

Redis obstojnost in replikacija v spominu

Primeri merjenja, kot so plačila, vključujejo shranjevanje in posodabljanje informacij, ki so ključne za podjetja. Izguba podatkov ima neposreden vpliv na prihodek. Prav tako lahko uniči evidence računov, ki so pogosto zahteve glede skladnosti ali upravljanja.

Skladnost in trajnost lahko v programu Redis nastavite glede na vaše podatkovne zahteve. Če potrebujete trajni dokaz o svojih merilnih podatkih, lahko trajnost dosežete z Redisovimi sposobnostmi obstojnosti. Redis podpira AOF (datoteka samo za dodajanje), ki kopira ukaze za pisanje na disk, ko se zgodijo, in posnetek, ki podatke v določenem trenutku vzame in zapiše na disk.

Vgrajena arhitektura Redis brez zaklepanja

Obdelava Redis je enojna; to zagotavlja celovitost podatkov, saj se vsi ukazi za pisanje samodejno zaporedijo. Ta arhitektura razvijalce in arhitekte razbremenjuje sinhronizacije niti v večnitnem okolju.

V primeru priljubljene potrošniške mobilne aplikacije bi lahko do nje hkrati dostopali na tisoče in včasih milijoni uporabnikov. Recimo, da aplikacija meri porabljeni čas in dva ali več uporabnikov si lahko hkrati deli minute. Vzporedne niti lahko posodobijo isti predmet, ne da bi to dodatno obremenjevalo zagotavljanje celovitosti podatkov. To zmanjšuje zapletenost zasnove aplikacije, hkrati pa zagotavlja hitrost in učinkovitost.

Redis meritve vzorčnih izvedb

Oglejmo si vzorčno kodo. Številni spodnji scenariji bi zahtevali zelo zapletene izvedbe, če uporabljena baza podatkov ne bi bila Redis.

Blokiranje več poskusov prijave

Da bi preprečili nepooblaščen dostop do računov, spletna mesta včasih uporabnikom preprečijo večkratne poskuse prijave v določenem časovnem obdobju. V tem primeru uporabnikom preprečimo več kot tri poskuse prijave v eni uri z uporabo preprostih ključnih funkcij časa za življenje.

Tipka za shranjevanje števila poskusov prijave:

user_login_attempts:

Koraki:

Pridobite trenutno število poskusov:

GET user_login_attempts:

Če je nič, nastavite ključ s časom poteka v sekundah (1 ura = 3600 sekund):

SET user_login_attempts: 1 3600

Če ni nič in če je število večje od 3, vrnite napako:

Če ni nič in če je število manjše ali enako 3, povečajte štetje:

INCR user_login_attempts:

Po uspešnem poskusu prijave se ključ lahko izbriše na naslednji način:

DEL user_login_attempts:

Plačaj sproti

Podatkovna struktura Redis Hash ponuja enostavne ukaze za sledenje uporabi in obračunu. V tem primeru predpostavimo, da ima vsaka stranka svoje podatke o obračunu shranjene v zgoščenki, kot je prikazano spodaj:

customer_billing:

uporabe

stroškov

     .

     .

Recimo, da vsaka enota stane dva centa, uporabnik pa je porabil 20 enot. Ukazi za posodobitev uporabe in obračuna so:

hincrby kupec: uporaba 20

kupec hincrbyfloat: stroški .40

Kot ste morda že opazili, lahko vaša aplikacija posodobi podatke v zbirki podatkov, ne da bi ji bilo treba naložiti podatke iz baze v svoj pomnilnik. Poleg tega lahko spremenite posamezno polje predmeta Hash, ne da bi prebrali celoten objekt.

Prosimo, upoštevajte: Namen tega primera je pokazati, kako uporabljati hincrby in hincrbyfloat ukazi. Z dobro zasnovo se izognete shranjevanju odvečnih informacij, kot sta uporaba in stroški.

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