Nõuded: Hiljuti nägin Bilibilis Redis Bloomi algoritmi videot, et lahendada vahemälu läbimise probleem – lihtsalt öeldes lisada loogiline hinnang enne andmebaasi ligipääsu, et kindlaks teha, kas andmed eksisteerivad, ja kui jah, siis pääse andmebaasile ligi. Näiteks kui veebileht on uudistesüsteem, genereeritakse artiklite URL-id isekasvavate esmaste võtmete ID-dega (URL-i formaat example:/news-1.html), veebilehel võib olla vaid kümneid tuhandeid artikleid ja vahemälusid.
Algselt:
Küsi uudisressurssi -> Määra, kas vahemälu eksisteerib -> Olemasolu -> Vahemälu tagastab andmeid. Küsi uudisteallikaid -> Määra, kas vahemälu eksisteerib -> ei eksisteeri -> Päring andmebaasist -> Esita -> Vahemälu ja tagasta andmed. Taotle uudisressurssi -> Määra, kas vahemälu eksisteerib -> ei eksisteeri -> Päring andmebaasist -> Ei eksisteeri -> Tagastab 404 vea.
Kohe praegu:
Küsi uudiste allikat -> Bloomi algoritm -> Olemasolu -> Järgi algset loogikat. Küsi uudisressurssi -> Bloomi algoritm -> ei eksisteeri -> tagastab otse 404 vea.
BloomFilter
BloomFilter algoritm on suurandmete ajastamise algoritm. Hulgas, kus on palju andmeid, saab täpselt kindlaks teha, et objekt ei kuulu hulka; On võimalik hinnata objekti komplektis ja võtta vähe ruumi. seeSee ei sobi olukordadesse, kus on vaja suurt täpsust ja null viga。 Ruumi tõhus kasutamine saavutatakse osalise täpsuse ohverdamisega.
Bloomi algoritm põhineb meetodilOhverdada teatud täpsus filtreerimisalgoritmi vastu, millel on madal mälutarbimine, mis suudab teostada suure hulga andmete filtreerimist, duplikeerimist ja muid toiminguid.
Bloomi algoritm on lihtsalt abstraktne kontseptsioon ja seda saab rakendada mitmel moel ning BitMapi kasutamine Redis artiklis on lihtsalt lihtne teostus.
Viide:Hüperlingi sisselogimine on nähtav.
BitMapi sissejuhatus
BitMap on bitikaart, mis on tegelikult baitmassiiv, esitatud binaarses vormis.On ainult kaks numbrit, 0 ja 1, bitikaart tähendab iga binaarbiti kasutamist elemendile vastava väärtuse salvestamiseks või märgistamiseks. Seda kasutatakse tavaliselt selleks, et määrata, kas teatud andmed eksisteerib või mitte, sest see on salvestatud bittides, seega säästab Bitmap ise oluliselt salvestusruumi.
Nagu alloleval joonisel näidatud, salvestatakse string arvutis binaarses vormis.
BitMap andmetüübid Redis
Redis'i poolt pakutav andmetüüp on BitMap ning iga bitt vastab kahele olekule: 0 ja 1. Kuigi sisemälu on endiselt string-tüüpi, pakub Redis mõningaid juhiseid BitMapi otseseks manipuleerimiseks, mida võib pidada bitimassiiviks ning massiivi indeksiks on nihe.
Selle eelised on:Madal mälukoormus ja kõrge efektiivsusJa operatsioon on lihtne.
Ruumisääst: Bitti kasutatakse elemendi väärtuse või oleku esindamiseks, kus võti on vastava elemendi väärtus. Tegelikult võib 8 bitti moodustada ühe baidi, seega on see ruumisäästlik. Kõrge efektiivsus: Setbiti ja getbiti ajakeerukus on O(1) ning teiste bittide efektiivsus on samuti kõrge.
Siin on näide hulgakogumiku ja BitMap salvestuse kasutamisest:
| Andmetüüp | Iga kasutajad võtab ruumi | Kasutajate arv, keda tuleb salvestada | Kõik hõivavad mälu | | Komplekt | 32 bitti on 4 baiti (eeldades, et kasutajaid kasutab täisarvusid, kasutavad paljud veebilehed tegelikult pikki täisarvusid) | 50,000,000 | 32 bitti * 50 000 000 = 200 MB | | Bitmap | 1 bitt | 100,000,000 | 1 bit * 100 000 000 = 12,5 MB |
Aeg venib natuke
| | Ühel päeval | Üks kuu | Üks aasta | | Komplekt | 200M | 6G | 72G | | Bitmap | 12,5M | 375M | 4.5G |
Arvutuse järel selgus, et aja möödudes suurenes salvestatavate andmete hulk, kontrast muutus selgemaks ja BitMap võttis vähem ruumi kui seatud.
Redis annab BitMapi kasutamiseks järgmised juhised:
Käsu dokumentatsioon:Hüperlingi sisselogimine on nähtav.
Nüüd, kui sul on lühike arusaam algoritmist ning Redis'i bitmap-omadustest ja süntaksist, kasutame redist lihtsaks operatsiooniks.
SETBIT süntaks:SETBIT võtme nihke väärtus
Sea artikli id:9, 10, 156 väärtuseks 1 ja käsk on järgmine:
GETBIT süntaks: GETBIT klahvinihe
Selleks, et määrata, kas id: 10 või 11 eksisteerib, on käsk järgmine:
.NET/C# manipuleerib Redis'i BitMap tüüpi
Õppisime mitmeid BitMap-käske redises ja kuidas neid programmiliselt kasutada. Loo uus .NET 3.1 konsooliprojekt, viita StackExchange.Redis paketile ja kasuta järgmist käsku:
Lähtekood on järgmine:
Redis'i jaoks on palju teisi bitikaardi rakenduse stsenaariume, nagu järgmised:
- Seda saab kasutada lihtsa Bloom-filtrina, et määrata, kas kasutaja on sooritanud teatud toiminguid.
- Kasutajate igapäevase aktiivsuse, kuuaktiivsuse ja säilitusmäära statistika
- Vaata statistikat kasutajate käivitamiste arvu kohta
- Kasutajate veebipõhine kohalolek ja inimeste statistika
(Lõpp)
|