sql >> Database >  >> NoSQL >> Redis

ip-bereiken opslaan in Redis

Het hangt ervan af of u van mening bent dat uw IP-bereiken elkaar kunnen overlappen of niet. Zo niet, dan is de oplossing vrij eenvoudig:

  • een verzameling hash gebruiken om gegevens van providers op te slaan
  • gebruik een zset om de maximale waarde van uw bereiken te indexeren
  • haal het (unieke) bereik op waarvan de maximale waarde groter is dan een IP
  • controleer of de minimale waarde van dit bereik lager is dan het IP

Voorbeeld:

Hier zijn mijn aanbieders. Elk van hen wordt geïdentificeerd met een id. Houd er rekening mee dat ik meer eigendommen kan toevoegen aan elke provider:

> hmset providers:1 name P1 min 3232235786 max 3232235826
OK
> hmset providers:2 name P3 min 1232235786 max 1232235826
OK
> hmset providers:3 name P3 min 2232235786 max 2232235826
OK
> hmset providers:4 name P4 min 4232235786 max 4232235826
OK

Elke keer dat een provider in het systeem wordt toegevoegd, moet er een index worden bijgehouden (handmatig:dit is Redis, geen relationele database). Score is de maximale waarde, lid is de id van het bereik.

> zadd providers:index 3232235826 1 1232235826 2 2232235826 3 4232235826 4
(integer) 4
> zrange providers:index 0 -1
1) "2"
2) "3"
3) "1"
4) "4"

Om nu het unieke bereik dat overeenkomt met een IP-adres op te vragen, hebt u 2 roundtrips nodig:

> zrangebyscore providers:index 3232235787 +inf LIMIT 0 1
1) "1"
> hgetall providers:1
1) "name"
2) "P1"
3) "min"
4) "3232235786"
5) "max"
6) "3232235826"

Dan hoeft het clientprogramma alleen maar te controleren of uw IP groter of gelijk is aan het minimumadres van het geretourneerde bereik.

Als je bedenkt dat de bereiken elkaar kunnen overlappen, is de oplossing veel complexer en is hier al uitgelegd.



  1. Vermijd de totale limiet van 16 MB

  2. Logboekregistratie configureren voor het MongoDB Java-stuurprogramma

  3. MongoDB telt verschillende waarde?

  4. Mongoose - veroorzaakt door ::11000 E11000 dubbele sleutelfoutindex?