[英]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.hton
和IPAddr.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.