Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 6755|Svar: 3

[Källa] .NET/C# använder Redis för att implementera Bloom-algoritmen baserad på BitMap

[Kopiera länk]
Publicerad på 2023-01-02 17:37:01 | | | |
Krav: Nyligen såg jag en video med Redis Bloom-algoritmen på Bilibili för att lösa problemet med cachepenetration, enkelt uttryckt, lägga till ett lager av logisk bedömning innan man går åt databasen för att avgöra om datan existerar, och i så fall få tillgång till databasen. Till exempel, om en webbplats är ett nyhetssystem, genereras artiklars URL:er med självinkrementerande primärnyckel-ID:n (URL-format example:/news-1.html), kan webbplatsen bara ha tiotusentals artiklar och cacher.

Ursprungligen:

Begär nyhetsresurs -> Fastställ om cachen finns -> Närvaro -> Cachen returnerar data.
Begär nyhetsresurser -> Bestäm om cachen existerar -> inte finns -> Fråga från databasen -> Presentera -> cache och returnera data.
Begär en nyhetsresurs -> Fastställ om cachen finns -> inte finns -> Fråga från databasen -> Finns inte -> Returnerar ett 404-fel.

Nu:

Begär nyhetsresurs -> Blooms algoritm -> Existence -> Följ den ursprungliga logiken.
Begär nyhetsresurs -> Blooms algoritm -> inte existerar -> returnerar ett 404-fel direkt.

BloomFilter

BloomFilter-algoritmen är en big data-schemaläggningsalgoritm. I en mängd med stora mängder data kan man noggrant fastställa att ett objekt inte ingår i mängden; Det är möjligt att bedöma ett objekt i en mängd och ta upp lite plats. detDen är inte lämplig för situationer som kräver hög noggrannhet och noll fel。 Effektiv användning av utrymme uppnås genom att offra partiell noggrannhet.

Blooms algoritm är en metod baserad påOffra en viss noggrannhet i utbyte mot en filtreringsalgoritm med låg minnesförbrukning, som kan genomföra filtrering, deduplicering och andra operationer för en stor mängd data.

Bloom-algoritmen är bara ett abstrakt koncept och kan implementeras på många sätt, och användningen av BitMap i Redis i artikeln är bara en enkel implementation.

Hänvisning:Inloggningen med hyperlänken är synlig.

Introduktion till BitMap

BitMap är en bitmap, som faktiskt är en bytearray, representerad i binärt system.Det finns bara två siffror, 0 och 1, bitmap är att använda varje binär bit för att lagra eller markera värdet som motsvarar ett element. Den används vanligtvis för att avgöra om viss data finns eller inte, eftersom den lagras i bitar, så Bitmap i sig sparar mycket lagringsutrymme.

Som visas i figuren nedan lagras strängen i binär form i datorn.



Bitmap-datatyper i Redis

Datatypen som Redis tillhandahåller är BitMap, och varje bit motsvarar två tillstånd: 0 och 1. Även om den interna lagringen fortfarande är i String-typen, tillhandahåller Redis vissa instruktioner för att direkt manipulera BitMap, vilket kan ses som en bitarray, och indexet i arrayen är offset.

Dess fördelar är:Låg minnesöverhead och hög effektivitetOch operationen är enkel.

Utrymmesbesparing: En bit används för att representera värdet eller tillståndet för ett element, där nyckeln är värdet på motsvarande element. Faktum är att 8 bitar kan utgöra en byte, så det sparar plats.
Hög effektivitet: Tidskomplexiteten för setbit och getbit är O(1), och effektiviteten hos andra bitar är också hög.

Här är ett exempel på att använda set collection och BitMap-lagring:

datatypVarje användarid tar upp platsAntalet användare som behöver lagrasAllt upptar minnet
ställa32 bitar är 4 byte (förutsatt att userid använder heltal, många webbplatser använder faktiskt långa heltal)50,000,00032 bitar * 50 000 000 = 200 MB
Bitmapp1 bit100,000,0001 bit * 100 000 000 = 12,5 MB


Tiden sträcker sig lite

En dagEn månadEtt år
ställa200 meter6G72G
Bitmapp12,5 miljoner375M4,5G


Efter beräkning fann man att ju längre tiden gick, desto mer data som skulle registreras, kontrasten blev mer uppenbar, och BitMap tog upp mindre plats än det satta.

Redis tillhandahåller följande instruktioner för att använda BitMap:

befallningillustreraTillgängliga versionerTidskomplexitet
Inloggningen med hyperlänken är synlig.Ställ in eller rensa bitarna på den angivna offset för strängvärdet som lagras i nyckeln.>= 2.2.0O(1)
Inloggningen med hyperlänken är synlig.För strängvärdet som lagras i nyckeln, erhåll bitarna på den angivna offseten.>= 2.2.0O(1)
Inloggningen med hyperlänken är synlig.Räknar antalet bitar i en given sträng som är satta till 1.>= 2.6.0O(N)
Inloggningen med hyperlänken är synlig.Returnerar positionen för den binära biten i bitmapen där det första värdet är bit.>= 2.8.7O(N)
Inloggningen med hyperlänken är synlig.Bitmanipulation på en eller flera strängtangenter som innehåller binära bitar.>= 2.6.0O(N)
Inloggningen med hyperlänken är synlig.BITFIELD-kommandot kan arbeta på flera bitintervall samtidigt i ett enda samtal.>= 3.2.0O(1)


Kommandodokumentation:Inloggningen med hyperlänken är synlig.

Nu när du har en kort förståelse för algoritmen och Bitmap-funktionerna och syntaxen i Redis, låt oss använda redis för att göra en enkel operation.

SETBIT-syntax:SETBIT-nyckeloffsetvärde

Sätt artikeln id:9, 10, 156 till 1, och kommandot är följande:

GETBIT-syntax: GETBIT-tangentförskjutning

För att avgöra om id: 10 eller 11 existerar, är kommandot följande:




.NET/C# manipulerar Redis BitMap-typ

Vi lärde oss om flera BitMap-kommandon i redis och hur man använder dem programmatiskt. Skapa ett nytt .NET 3.1-konsolprojekt, referera till StackExchange.Redis-paketet och använd följande kommando:

Källkoden är följande:



Det finns många andra bitmap-applikationsscenarier för Redis, såsom följande:

  • Den kan användas som ett enkelt Bloom-filter för att avgöra om en användare har utfört vissa åtgärder.
  • Statistik över användarens dagliga aktivitet, månatlig aktivitet och kvarhållningsgrad
  • Förstå statistiken över antalet användarlanseringar
  • Användares närvaro på nätet och statistik över personer

(Slut)




Föregående:Virtuella skådespelare: Dapr vs Orleans
Nästa:Alibaba Cloud SLB lastbalansering 503 felupplösning
 Hyresvärd| Publicerad på 2023-01-02 17:41:56 |
Publicerad på 2023-01-02 20:42:47 |
Jag har lärt mig, tack, och fått kunskap
Publicerad på 2023-01-06 20:34:22 |
Lär dig att lära dig
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com