IP範囲が重複する可能性があるかどうかによって異なります。重複しない場合、解決策は非常に簡単です。
- ハッシュのコレクションを使用してプロバイダーデータを保存する
- zsetを使用して範囲の最大値にインデックスを付けます
- 最大値がIPより大きい(一意の)範囲を取得します
- この範囲の最小値がIPよりも小さいことを確認してください
例:
これが私のプロバイダーです。それぞれがIDで識別されます。各プロバイダーにアタッチされたプロパティをさらに追加できることに注意してください:
> 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
プロバイダーがシステムに追加されるたびに、インデックスを維持する必要があります(手動:これはRedisであり、リレーショナルデータベースではありません)。スコアは最大値、メンバーは範囲の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"
ここで、IPアドレスに対応する一意の範囲を照会するには、2回のラウンドトリップが必要です。
> 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"
次に、クライアントプログラムは、IPが返された範囲の最小アドレス以上であることを確認する必要があります。
ここで、範囲が重複する可能性があることを考慮すると、解決策ははるかに複雑であり、ここですでに説明されています。