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

memorizzare gli intervalli di IP in Redis

Dipende se ritieni che i tuoi intervalli IP possano sovrapporsi o meno. In caso contrario, la soluzione è abbastanza semplice:

  • utilizza una raccolta di hash per archiviare i dati dei fornitori
  • usa uno zset per indicizzare il valore massimo dei tuoi intervalli
  • recupera l'intervallo (unico) il cui valore massimo è maggiore di un IP
  • controlla che il valore minimo di questo intervallo sia inferiore all'IP

Esempio:

Ecco i miei fornitori. Ciascuno di essi è identificato con un id. Si prega di notare che potrei aggiungere più proprietà allegate a ciascun 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

Ogni volta che un provider viene aggiunto al sistema, deve essere mantenuto un indice (manualmente:questo è Redis, non un database relazionale). Il punteggio è il valore massimo, membro è l'id dell'intervallo.

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

Ora per interrogare l'intervallo univoco corrispondente a un indirizzo IP, sono necessari 2 roundtrip:

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

Quindi il programma client deve solo verificare che il tuo IP sia maggiore o uguale all'indirizzo minimo dell'intervallo restituito.

Ora, se consideri che gli intervalli possono sovrapporsi, la soluzione è molto più complessa ed è già stata spiegata qui.