Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 6755|Svare: 3

[Kilde] .NET/C# bruker Redis til å implementere Bloom-algoritmen basert på BitMap

[Kopier lenke]
Publisert på 02.01.2023 17:37:01 | | | |
Krav: Nylig så jeg en video av Redis Bloom-algoritmen på Bilibili for å løse problemet med cache-penetrasjon, enkelt sagt, legge til et lag med logisk vurdering før tilgang til databasen for å avgjøre om dataene eksisterer, og i så fall, få tilgang til databasen. For eksempel, hvis et nettsted er et nyhetssystem, genereres URL-ene til artikler av selvøkende primærnøkkel-IDer (URL-format example:/news-1.html), nettstedet kan bare ha titusenvis av artikler og cacher.

Opprinnelig:

Be om nyhetsressurs -> Bestem om cachen eksisterer -> Tilstedeværelse -> Cachen returnerer data.
Be om nyhetsressurser -> Avgjør om cachen eksisterer -> ikke eksisterer -> Søk fra databasen -> Presenter -> Cache og returner data.
Be om en nyhetsressurs -> Bestem om cachen eksisterer -> ikke eksisterer -> Søk fra databasen -> Finnes ikke -> Returnerer en 404-feil.

Akkurat nå:

Be om nyhetsressurs -> Blooms algoritme -> Existence -> Følg den opprinnelige logikken.
Be om nyhetsressurs -> Blooms algoritme -> ikke eksisterer -> returnerer en 404-feil direkte.

BloomFilter

BloomFilter-algoritmen er en stor dataplanleggingsalgoritme. I en mengde med store mengder data kan det nøyaktig fastslås at et objekt ikke er i mengden; Det er mulig å vurdere et objekt i en mengde og ta opp lite plass. detDen er ikke egnet for situasjoner som krever høy nøyaktighet og null feil。 Effektiv plassbruk oppnås ved å ofre delvis nøyaktighet.

Blooms algoritme er en metode basert påOfre en viss nøyaktighet i bytte mot en filtreringsalgoritme med lavt minneforbruk, som kan realisere filtrering, deduplisering og andre operasjoner av store mengder data.

Bloom-algoritmen er bare et abstrakt konsept og kan implementeres på mange måter, og bruken av BitMap i Redis i artikkelen er bare en enkel implementering.

Referanse:Innloggingen med hyperkoblingen er synlig.

Introduksjon til BitMap

BitMap er et bitmap, som egentlig er et byte-array, representert binært.Det finnes bare to tall, 0 og 1, bitmap er å bruke hver binær bit til å lagre eller markere verdien som tilsvarer et element. Den brukes vanligvis for å avgjøre om en viss data eksisterer eller ikke, fordi den lagres i biter, så Bitmap i seg selv vil spare lagringsplass betydelig.

Som vist i figuren nedenfor, lagres strengen i binær form i datamaskinen.



BitMap-datatyper i Redis

Datatypen som Redis gir er BitMap, og hver bit tilsvarer to tilstander: 0 og 1. Selv om den interne lagringen fortsatt er i String-typen, gir Redis noen instruksjoner for direkte håndtering av BitMap, som kan betraktes som et bitarray, og indeksen til arrayet er offset.

Fordelene er:Lav minneoverhead og høy effektivitetOg operasjonen er enkel.

Plasssparing: En bit brukes til å representere verdien eller tilstanden til et element, der nøkkelen er verdien til det tilsvarende elementet. Faktisk kan 8 biter utgjøre en byte, så det sparer plass.
Høy effektivitet: Tidskompleksiteten til setbit og getbit er O(1), og effektiviteten til andre biter er også høy.

Her er et eksempel på bruk av set-samlingen og BitMap-lagring:

datatypeHver userid tar opp plassAntallet brukere som må lagresAlt opptar minnet
sett32 biter er 4 byte (forutsatt at userid bruker heltall, mange nettsteder bruker faktisk lange heltall)50,000,00032 biter * 50 000 000 = 200 MB
Punktgrafikk1 bit100,000,0001 bit * 100 000 000 = 12,5 MB


Tiden strekker seg litt

En dagEn månedEtt år
sett200M6G72G
Punktgrafikk12,5M375M4,5G


Etter beregning ble det funnet at etter hvert som tiden gikk, økte mengden data som skulle registreres, kontrasten ble mer tydelig, og BitMap tok mindre plass enn det som var satt opp.

Redis gir følgende instruksjoner for å bruke BitMap:

kommandoillustrereTilgjengelige versjonerTidskompleksitet
Innloggingen med hyperkoblingen er synlig.Sett eller fjern bitene på den angitte offset for strengverdien lagret i nøkkelen.>= 2.2.0O(1)
Innloggingen med hyperkoblingen er synlig.For strengverdien lagret i nøkkelen, hent bitene på den angitte offseten.>= 2.2.0O(1)
Innloggingen med hyperkoblingen er synlig.Teller antall biter i en gitt streng som er satt til 1.>= 2.6.0O(N)
Innloggingen med hyperkoblingen er synlig.Returnerer posisjonen til den binære biten i bitmapen der den første verdien er biten.>= 2.8.7O(N)
Innloggingen med hyperkoblingen er synlig.Bitmanipulering på en eller flere strengtaster som inneholder binære biter.>= 2.6.0O(N)
Innloggingen med hyperkoblingen er synlig.BITFIELD-kommandoen kan operere på flere bitområder samtidig i et enkelt kall.>= 3.2.0O(1)


Kommandodokumentasjon:Innloggingen med hyperkoblingen er synlig.

Nå som du har en kort forståelse av algoritmen og Bitmap-funksjonene og syntaksen til Redis, la oss bruke redis til å gjøre en enkel operasjon.

SETBIT-syntaks:SETBIT-nøkkelforskyvningsverdi

Sett artikkelen id:9, 10, 156 til 1, og kommandoen er som følger:

GETBIT-syntaks: GETBIT-nøkkelforskyvning

For å avgjøre om id: 10 eller 11 eksisterer, er kommandoen som følger:




.NET/C# manipulerer Redis sin BitMap-type

Vi lærte om flere BitMap-kommandoer i redis og hvordan man bruker dem programmessig. Lag et nytt .NET 3.1-konsollprosjekt, referer til StackExchange.Redis-pakken, og bruk følgende kommando:

Kildekoden er som følger:



Det finnes mange andre bitmap-applikasjonsscenarier for Redis, som følger:

  • Den kan brukes som et enkelt Bloom-filter for å avgjøre om en bruker har utført visse handlinger.
  • Statistikk over brukerens daglige aktivitet, månedlig aktivitet og opprettholdelsesrate
  • Forstå statistikken for antall brukeroppstarter
  • Brukernes tilstedeværelse på nett og statistikk over personer

(Slutt)




Foregående:Virtuelle skuespillere: Dapr vs Orleans
Neste:Alibaba Cloud SLB lastbalansering 503 feiloppløsning
 Vert| Publisert på 02.01.2023 17:41:56 |
Publisert på 02.01.2023 20:42:47 |
Jeg har lært, takk, og fått kunnskap
Publisert på 06.01.2023 20:34:22 |
Lær å lære
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com