sql >> Databasteknik >  >> NoSQL >> Redis

lagra ip-serier i Redis

Det beror på om du anser att dina IP-intervall kan överlappa eller inte. Om inte är lösningen ganska enkel:

  • använd en samling hash för att lagra leverantörsdata
  • använd en zset för att indexera maxvärdet för dina intervall
  • hämta det (unika) intervallet vars maxvärde är större än en IP
  • kontrollera att minvärdet för detta intervall är lägre än IP:n

Exempel:

Här är mina leverantörer. Var och en av dem identifieras med ett id. Observera att jag kan lägga till fler egenskaper kopplade till varje leverantör:

> 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

Varje gång en leverantör läggs till i systemet måste ett index underhållas (manuellt:detta är Redis, inte en relationsdatabas). Poäng är maxvärdet, medlem är intervallets id.

> 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"

För att nu fråga det unika intervallet som motsvarar en IP-adress, behöver du två tur och retur:

> 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"

Sedan måste klientprogrammet bara kontrollera att din IP är större eller lika med minimiadressen för det returnerade intervallet.

Om du nu anser att intervallen kan överlappa, är lösningen mycket mer komplex, och den har redan förklarats här.



  1. Redis letar efter env redis url-variabel inte säker på var env-variabeln ska placeras dålig URI(är inte URI?):(URI::InvalidURIError)

  2. Skillnad mellan dokumentbaserade och nyckel-/värdebaserade databaser?

  3. Kan mongodb användas som en inbäddad databas?

  4. Mongodb-fråga med fält i samma dokument