草庐IT

mongodb - 在mongoDB中保存IP地址

coder 2023-05-04 原文

目前为了保存 IP 地址,我将其转换为数字并将其存储在集合中。基本上我这样做是为了记录目的。这意味着我希望尽可能快地以最小的空间存储信息。

我很少用它来查询。

我的想法

  • 存储为字符串肯定是低效的。
  • 存储为 4 位数字会更慢,并且会占用更多空间。

尽管如此,我认为这是一种足够的方法,但是否有更好的方法适合我的目的?

最佳答案

绝对将 IP 地址保存为数字,如果您不介意这需要额外的工作,特别是如果您需要对地址进行查询并且您有大型表/集合。

原因如下:

存储

  • 如果存储为无符号整数,则 IPv4 地址为 4 个字节。
  • 当以点分八进制格式写成字符串时,IPv4 地址在 10 字节和 18 字节之间变化。 (假设平均值为 14 个字节。)

字符占 7-15 个字节,如果您使用的是可变长度字符串类型,则为 2-3 个字节,这取决于您使用的数据库。如果您有可用的固定长度字符串表示,则必须使用 15 个字符的固定宽度字段。

磁盘存储很便宜,因此在大多数用例中这不是一个因素。然而,内存并不便宜,如果您有一个大表/集合并且想要进行快速查询,那么您需要一个索引。字符串编码的 2-3 倍存储损失极大地减少了您可以索引的记录数量,同时仍将索引保留在内存中。

  • 如果存储为无符号整数,则 IPv6 地址为 16 个字节。 (可能是多个 4 或 8 字节整数,具体取决于您的平台。)
  • 一个 IPv6 地址的范围从 6 个字节到 42 个字节,当以缩写的十六进制表示法编码为一个字符串时。

在低端,环回地址 (::1) 是 3 个字节加上可变长度字符串开销。在高端,像 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2 这样的地址使用 39 个字节加上可变长度字符串开销。

与 IPv4 不同,假设 IPv6 字符串的平均长度为 6 和 42 的平均值是不安全的,因为具有大量连续零的地址数量仅占整个 IPv6 地址空间的一小部分。只有一些特殊地址,如 loopback 和 autoconf 地址,可能会以这种方式进行压缩。

同样,对于字符串编码,与整数编码相比,这会造成 >2 倍的存储损失。

网络数学

您认为路由器将 IP 地址存储为字符串吗?他们当然不会。

如果您需要对 IP 地址进行网络数学运算,则字符串表示很麻烦。例如。如果您想编写一个搜索特定子网上所有地址的查询(“返回所有 IP 地址在 10.7.200.104/27 的记录”,您可以通过使用整数子网掩码屏蔽整数地址来轻松完成此操作。( Mongo 不支持此特定查询,但大多数 RDBMS 支持。)如果将地址存储为字符串,那么您的查询将需要将每一行转换为整数,然后对其进行屏蔽,这会慢几个数量级。(按位屏蔽对于 IPv4 地址,可以使用 2 个寄存器在几个 CPU 周期内完成。将字符串转换为整数需要遍历字符串。)

同样,整数地址的范围查询(“返回 192.168.1.50 和 192.168.50.100 之间的所有记录”)将能够使用索引,而对字符串地址的范围查询则不能。

底线

这需要更多的工作,但并不多(有一百万个 aton() 和 ntoa() 函数),但是如果你正在构建一些严肃而可靠的东西,并且你想在未来证明它不会 future 的需求和大型数据集的可能性,您应该将 IP 地址存储为整数,而不是字符串。

如果您正在做一些快速而肮脏的事情,并且不介意将来进行改造的可能性,那么请使用字符串。

出于 OP 的目的,如果您正在优化速度和空间,并且您认为您不想经常查询它,那么为什么要使用数据库呢?只需将 IP 地址打印到文件中。这将比将其存储在数据库中(具有相关的 API 和存储开销)更快、存储效率更高。

关于mongodb - 在mongoDB中保存IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15591234/

有关mongodb - 在mongoDB中保存IP地址的更多相关文章

  1. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  2. ruby-on-rails - 验证电子邮件地址是 Paypal 用户 - 2

    我想验证一个电子邮件地址是否是PayPal用户。是否有API调用来执行此操作?是否有执行此操作的ruby​​库?谢谢 最佳答案 GetVerifiedStatus来自PayPal'sAdaptiveAccounts平台会为您做这件事。PayPal没有任何codesamples或SDKs用于Ruby中的自适应帐户,但我确实找到了编写codeforGetVerifiedStatusinRuby的人.您需要更改该代码以检查他们拥有的帐户类型的唯一更改是更改if@xml['accountStatus']!=nilaccount_status

  3. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  4. ruby-on-rails - 如何在 Rails 3 中保存到数据库之前格式化值 - 2

    我有一个带有利润字段的用户模型。利润字段是DECIMAL(11,0)类型。我在表单上有一个屏蔽输入,允许用户输入1,000美元之类的内容。我想格式化该值并从中删除除数字以外的所有内容,这样我将保存1000。这是我到目前为止所拥有的:classUser但它一直在数据库中保存0。看起来它在我的格式化函数之前将其转换为十进制。 最佳答案 试试这个:defprofit=(new_profit)self[:profit]=new_profit.gsub(/[^0-9]/,'')end 关于ruby

  5. ruby-on-rails - 从 Geocode 经纬度获取地址 - 2

    对于我的大部分应用程序,我从Geocoder获取城镇/城市的纬度、经度、邮政编码等。我只是投入城市和州,作为返回,我得到了我处于一个有field的场景中。该场所需要一个地址,我正在从另一个来源获取该场所的纬度和经度。使用Geocodergem,我可以通过给地址提供经纬度来获取地址吗? 最佳答案 在Rails控制台中运行。latitude=40.0397longitude=-76.30144geo_localization="#{latitude},#{longitude}"query=Geocoder.search(geo_loca

  6. ruby-on-rails - 如何在 Rails 2 中保存上传的文件 - 2

    您好,我在Rails2应用程序中集成了ZohoSheet,我可以从本地打开新的ZohoSheet,但是当我在zoho编辑器中单击保存时,它会将文件发送到我的服务器,这是我的生产日志ProcessingZohoController#indexto#(for*.*.*.*at2015-10-0811:24:08)[POST]Parameters:{"controller"=>"zoho","filename"=>#,"content"=>#,"eventsource"=>#,"format"=>#,"id"=>#,"action"=>"index"}ActionController::In

  7. ruby - 没有 nginx 的 Puma - 同一 IP 上的多个 ruby​​ 应用程序 :PORT - 2

    Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect

  8. ruby-on-rails - 在 Rails 4 中保存嵌套模型 - 2

    对Rails来说有点新,但有点新。其中一个模型在has_many/belongs_to关联中依赖于另一个模型。基本上,在我的应用程序上创建“帖子”时,用户还可以附加“图片”。理想情况下,这是两个独立的模型。当用户选择一张照片时,一些JavaScript将其上传到Cloudinary,返回的数据(ID、宽度、高度等)被JSON字符串化并设置在隐藏字段上。#TheHTML=f.hidden_field:images,:multiple=>true,:class=>"image-data"#Setourimagedataonthehiddenfieldtobeparsedbytheserve

  9. Java IP归属地查询(离线方式+在线方式,内附查询IP方法) - 2

    一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正

  10. IP数据报格式 - 2

    1、报文格式前几篇总结过较多网络层的知识,ARP,ip地址、子网掩码等等。这次总结一下IP数据报的报文格式IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(4字节)为单位来描述的。wireshark中IP数据报文呈现一个IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节。是所有IP数据报文必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。2、首部个字段意义  1、版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。版本号为6(即IPv6)  2、首部

随机推荐