簡體   English   中英

Redis:我應該將IP轉換為整數嗎?

[英]Redis: should I convert IPs into integers?

我需要將IP地址存儲在Redis哈希中。

如果IP以整數而不是字符串存儲,會節省大量內存嗎?

我將使用Ruby的IPAddr將IP轉換為int。

這取決於您的操作方式。 在Redis中,鍵和(葉)值是字符串。 如果將IP地址轉換為int並將其發送給Redis,如以下代碼所示,將不會節省很多:

redis.hset("xyz", "ip", IPAddr.new(ip).to_i)

例如,IP“ 255.255.255.255”為點分四邊形形式的15個字節,當保存為字符串時,其整數表示“ 4294967295”為10個字節,這就是上面的代碼所要做的。

要減少到Redis中存儲的四個字節,您必須發送原始字節“ \\ xFF \\ xFF \\ xFF \\ xFF”。

在Ruby中,您可以這樣做:

packed_ip = IPAddr.new(ip).hton
redis.hset("xyz", "ip", packed_ip)

然后當你讀回它

packed_ip = redis.hget("xyz", "ip")
ip = IPAddr.ntop(packed_ip)

IPAddr.htonIPAddr.ntop作用是這樣的:

packed_ip = ip.split('.').map(&:to_i).pack('C4') # hton
ip = packed_ip.unpack('C4').join('.') # ntop

然后是有關IPv6的全部內容,但我想IPAddr已經為您介紹了。

您可能還希望重新考慮一下您的方法,如果您希望將應用程序轉換為使用IPv6(甚至只是支持它),那么將IPv6存儲為整數將是一個非常糟糕的主意。

如今,內存/磁盤空間很便宜,因此,如果可以的話,與擔心磁盤空間相比,最好投資於可行的面向未來的解決方案。

在這種情況下,字符串仍然是最佳選擇,因為您可以在同一字段中使用IPv6和IPv4。

如果您將ip存儲為一個整數,它將占用4個字節。 作為字符串“ abc.def.ghi.jkl”存儲為空終止的ascii字符串時,它將用完16個字節,因此,如果存儲為unicode字符串,則至少是4甚至7+的因數。 而且搜索整數要比字符串搜索快得多,因為您的處理器已經過優化以比較整數...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM