sql >> Database teknologi >  >> NoSQL >> Redis

Introduktion til Redis datastrukturer:sæt

Redis (Remote Dictionary Server) er et uhyre populært nøgleværdilager i hukommelsen, som også giver mulighed for valgfri holdbarhed, partitionering, replikering og en lang række andre funktioner. Det er i øjeblikket den mest populære nøgleværdi-database og er kendt for sin enkelhed, lave hukommelsesfodaftryk og en lav indlæringskurve. Redis omtales også som en datastrukturserver og understøtter atomoperationer på datastrukturer som hashes, lister, sæt, sorterede sæt, bitmaps og hyperloglogs. I dette indlæg vil vi se på den indstillede datatype leveret af Redis sammen med dens brug og virkelige brugstilfælde.

Redis-sæt

Redis-sæt er uordnede samlinger af strenge (en streng er den grundlæggende Redis-værdi, som kan indeholde næsten hvad som helst), der giver konstant tilføjelse, fjernelse og medlemskontrol. Redis understøtter også rimelig hurtige forenings-, skærings- og subtraktionsoperationer mellem sæt. Som forventet tillader den ikke gentagne værdier.

Her er nogle eksempler på Redis-sæt i aktion fra redis-cli . Her er en oversigt over nøglerepræsentationer i eksemplet nedenfor:

  • users:all repræsenterer et sæt af alle brugere, der er registreret på et websted.
  • users:actv repræsenterer aktive brugere.
  • users:inactv repræsenterer inaktive brugere (brugere, der ikke har besøgt webstedet i et stykke tid).
# sadd key member [member ...] : add members to a set
127.0.0.1:6379> sadd users:all 11 12 13 14 15 Rocket Pocket Socket
(integer) 8
127.0.0.1:6379> type users:all
set
# smembers key: get all members of a set
127.0.0.1:6379> smembers users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "Rocket"
7) "12"
8) "15"
# sismember key member: is the given value a member of the set?
127.0.0.1:6379> sismember users:all 00
(integer) 0
127.0.0.1:6379> sismember users:all 11
(integer) 1
127.0.0.1:6379> sismember users:all Socket
(integer) 1
127.0.0.1:6379> sadd users:inactv 11 12 13
(integer) 3
# sinter key [key ...]: Intersection of multiple sets
# Similar: sinterstore stores the result of intersection of sets to a new set
127.0.0.1:6379> sinter users:all users:inactv
1) "11"
2) "12"
3) "13"
# scard key: cardinality of the set i.e. number of members present in the set
127.0.0.1:6379> scard users:all
(integer) 8
# sdiff key [key ...] : Subtract multiple sets
# Similar: sdiffstore: subtract and store result in a new destination set
127.0.0.1:6379> sdiff users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "12"
7) "Rocket"
8) "15"
127.0.0.1:6379> sdiff users:all users:inactv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
# sdiffstore destination key [key ...]
127.0.0.1:6379> sdiffstore users:actv users:all users:inactv
(integer) 5
127.0.0.1:6379> smembers users:actv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
127.0.0.1:6379> sdiff users:all users:actv users:inactv
(empty list or set)
# smove source destination member: move a member from source set to destination.
127.0.0.1:6379> smove users:inactv users:actv 11
(integer) 1
127.0.0.1:6379> smembers users:actv
1) "Pocket"
2) "11"
3) "Socket"
4) "14"
5) "Rocket"
6) "15"

Andre vigtige sætkommandoer inkluderer:

  • SUNION – sæt union
  • SPOP – fjern tilfældigt et element
  • SREM – fjern et eller flere elementer

Den komplette liste over sæt-relaterede Redis-kommandoer kan findes her.

Redis Internals

Redis gemmer internt sæt som ordbøger. Ordbøger i Redis er implementeret som hashtabeller, der bruger hashfunktionen MurmurHash2 og vokser via trinvis størrelsesændring. Hashkollisioner håndteres ved lænkning. Sæt har en speciel kodning for små sæt, når alle medlemmer af et sæt er i radix 10 i intervallet # af 64 bit fortegnede heltal kaldet IntSets. Dette er i det væsentlige en sorteret række af heltal. Søgninger i arrayet udføres gennem binær søgning. Det er klart, at denne implementering er effektiv til meget små sæt. Størrelsen, som denne kodning bruges til, er styret af set-max-intset-entries konfigurationsparameter. Standardværdien er 512. En god beskrivelse af interne datastrukturer brugt af Redis kan findes her.

Redis-applikationer

Her er en lille liste over et par af de mulige Redis Set-applikationer:

  • Som et sæt kan det bruges til at spore unikke elementer:
    • Alle unikke IP-adresser, der besøger dit websted.
    • Alle unikke jobforekomster i øjeblikket i en given tilstand osv.
  • Igen, som et sæt, kan det bruges til at betegne som "hører til" eller lignende forhold:
    • Alle SKU'er, der tilhører en bestemt kategori.
    • Alle objekter med et bestemt tag osv.
  • Mængder kan kun bruges til at kombinere relationer, dvs. forening/skæring/subtraktion af mængder:
    • Alle SKU'er, der tilhører kategorien af ​​t-shirts, men ikke en underkategori af polohalse.

Lad os tage et eksempel fra det virkelige liv og udforske sæt relaterede use cases yderligere.

Visuel profiler til din e-bogsbutik

Lad os sige, at du er ejer af en meget stor online boghandel, der viser millioner af titler. Din primære database er MongoDB, og den fungerer ret godt for de fleste af dine brugssager med korrekt brug af indeksering, sharding osv. Her er et delvist DB-dokumentskema for bøgerne samlinger:

...
sku: SKU,
pid: Product ID,
title: String,
auth: String,
pub: String,
isbn: ISBN,
edition: Int,
price: Float,
rating: Float,
cats: [String, String ...],
tags: [String, String ...],
...

Du registrerer også transaktioner i en samling kaldet txns som kan se sådan ud:

txnid: TxnID,
cid: CustomerID,
amnt: Float,
curr: Currency,
sku: [sku1, sku2, ...],
time: TimeStamp,
...

Og en samling for visninger kaldet visninger:

time: TimeStamp, # daily aggregated
cid: CustomerID,
sku: [sku1, sku2, ...],
...

Det er klart, at dette er et meget forenklet eksempel, som gør brede antagelser. Vores hensigt er at vise et Redis-eksempel i et (nær) scenarie fra den virkelige verden.

Ok, så nu vil du som butikschef have et Visual Profiler-værktøj til at analysere relationer og kundeadfærd på tværs af forskellige kategorier. For eksempel:

  • Hvad er den mest populære kategori?
  • Kikker folk, der kigger på eller køber science fiction, også på non-fiction?

Du vil gerne være i stand til at gøre dette i realtid, dvs. profilerens brugergrænseflade vil afkrydse felter, knapper, der lader dig ændre parametre og se resultater (næsten) med det samme.

At udføre sådanne operationer på MongoDB vil medføre, at du udfører ret involverede forespørgsler for at forbinde forskellige kategorier, tags og andre data, som du måske bekymrer dig om. Med et arbejdssæt, der ikke passer i hukommelsen, ville dette ikke være de hurtigste operationer. For eksempel:

  • At finde alle bøger, der sælges i dag, og som var fiktion, men ikke science fiction, vil indebære at forespørge på txn indsamling af dagens transaktioner. Derefter gentages SKU'erne for at indsamle deres kategorier og derefter udføre $in/$nin operationer.

Lad os se, hvordan dette ville blive håndteret ved at bringe Redis ind i blandingen. Ved slutningen af ​​hver dag kan daglige planlagte job køre over disse MongoDB-samlinger for at oprette Redis-sæt. Den slags sæt, du vil oprette, afhænger af den type filtre, du vil understøtte på din frontend. Lad os f.eks. sige, at du gerne vil understøtte kategorirelaterede forespørgsler. Vi vil gerne oprette sæt som:

cat:type:catID
cat:sku:fiction
cat:sku:nonfiction
cat:sku:scfiction
cat:sku:history
cat:sku:milhistory
cat:sku:military
...
cat:cid:fiction
cat:cid:nonfiction
cat:cid:scfiction
cat:cid:history
cat:cid:milhistory
cat:cid:military
...

cat:sku:*-sættene vil indeholde SKU'er for bøger, der er solgt/set i dag i den kategori. På samme måde vil cat:cid:* indeholde CID for kunder, der har købt/solgt bøger i den kategori. Et eksempel på spørgsmål, vi kan besvare med disse sæt, er:

  • Kunder (eller antal kunder), der har set/købt skønlitterære bøger (enkelt kategori) i dag:smembers cat:cid:fiction
  • Kunder, der har set/købt historie, men ikke militærhistorie i dag:sdiff cat:cid:history cat:cid:milhistory
  • (Antal) solgte bøger i dag, som var Science Fiction og Military, dvs. militær science fiction:sinter cat:sku:scfiction cat:sku:military
  • Et hvilket som helst antal af sådanne forenings-, skærings- og differensoperationer, som du holder af.

Dette i sig selv giver os meget kraftfulde forespørgselsmuligheder. Lad os tilføje flere sæt! Lad os sige, at vi opretter yderligere sæt baseret på bogbedømmelser. For eksempel:

rat:sku:5str: Set of books with ratings > 4.5
rat:sku:4str: Set of books with ratings > 3.5 && <= 4.5
rat:sku:3str: ...
rat:sku:2str: ...
...
rat:cid:5str: Set of customer who bought books with ratings as mentioned above.
rat:cid:4str: ...
..

Udstyret med disse sæt er du nu i stand til hurtigt at finde ud af ting som:

  • 4-stjernede og højere skønlitterære bøger købt i dag:  sunionstore rat:sku:4strabv rat:sku:5str rat:sku:5str/sinter rat:sku:4strabv kat :sku:fiktion
  • Kunde, der har købt 3-stjernede bøger og derover i historien:sunionstore rat:cid:5strabv rat:cid:3str rat:cid:5str rat:cid:5str/sinter cat:cid:history rat:cid:5strabv

Lad os nu sige, at du vil sende en rabatkupon til alle dine kunder, der har købt en astrologibog i dag med en vurdering på 2 eller derunder (som en undskyldning for den dårlige oplevelse at skulle læse den bog!). Du kan eksportere listen over Kunde-ID s ud og send den til din e-mail-applikation. På samme måde kan du oprette sæt til andre ting, du måtte ønske at eksponere som filtre i din Visual Profiler, såsom tags, prisklasser osv.

Fordelene ved at bruge Redis-sæt er indlysende her. In-memory-butikken vil føre til virkelig hurtig adgang, så frontenden føles snappy. Derudover er Redis set operationer enten konstant tid eller lineær.

Konklusion

I dette indlæg introducerede vi med eksempler et af de mest nyttige Redis Data Structures:Sets. Her er nogle af vores andre indlæg i Redis-datastrukturserien:

  • Redis Hashes
  • Redis Bitmaps
  • Redis-sæt
  • Redis Sorterede sæt


  1. Opdater et underdokument indeholdt i et array indeholdt i et MongoDB-dokument

  2. Lagring af filer i MongoDB med GridFS

  3. Udgiv abonner med nodejs og redis(node_redis)

  4. DIY Cloud Database på Amazon Web Services - Ny hvidbog