Điều đó phụ thuộc vào việc bạn xem xét các dải IP của mình có thể trùng nhau hay không. Nếu không, giải pháp khá đơn giản:
- sử dụng tập hợp băm để lưu trữ dữ liệu của nhà cung cấp
- sử dụng zset để lập chỉ mục giá trị tối đa của các phạm vi của bạn
- truy xuất phạm vi (duy nhất) có giá trị tối đa lớn hơn IP
- kiểm tra giá trị tối thiểu của dải ô này có thấp hơn IP
Ví dụ:
Đây là những nhà cung cấp của tôi. Mỗi người trong số họ được xác định bằng một id. Xin lưu ý rằng tôi có thể thêm các thuộc tính khác được đính kèm vào từng nhà cung cấp:
> 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
Mỗi khi nhà cung cấp được thêm vào hệ thống, một chỉ mục phải được duy trì (theo cách thủ công:đây là Redis, không phải cơ sở dữ liệu quan hệ). Điểm là giá trị tối đa, thành viên là id của phạm vi.
> 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"
Bây giờ để truy vấn dải ô duy nhất tương ứng với một địa chỉ IP, bạn cần 2 bước vòng:
> 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"
Sau đó, chương trình khách hàng chỉ phải kiểm tra xem IP của bạn có lớn hơn hoặc bằng địa chỉ tối thiểu của dải ô trả về hay không.
Bây giờ, nếu bạn cho rằng các phạm vi có thể chồng chéo lên nhau, thì giải pháp phức tạp hơn nhiều và nó đã được giải thích ở đây.