把整个 IPV4 存储到数据库里,仅仅记录某个 IP 开放的 TCP 端口。该选用什么数据库和数据格式?? 比如,8.8.8.8 开放了 53 就记录一下。
1
RedFlag2233 OP UP
|
2
zpfhbyx 2021-05-31 15:23:34 +08:00
134744072.53
|
3
Kinnice 2021-05-31 15:25:16 +08:00
ip 转 int 做主键,后面端口用 list[80,53]
|
4
imdong 2021-05-31 15:25:39 +08:00
记录一些 IP 的话,估计就是 Long IP?
如果要记录所有 IPv4 地址的话,那就是面试题中有限空间存数据的问题,需要 0xffffffff 长度的完整空间,对应点位置 0 / 1 |
5
knives 2021-05-31 15:41:41 +08:00
如果用 PostgreSQL 的话,可以试试 cidr/inet 类型来存储 IP 。端口号独立字段,可以考虑使用数组存储。
|
6
moen 2021-05-31 15:43:03 +08:00
pg 直接 inet 类型存 IP,integer[] 存端口。想抠存储空间用 smallint[] 也不是不行,就是得转成有符号数
|
7
ch2 2021-05-31 15:44:07 +08:00
mongo
|
8
yukiww233 2021-05-31 15:50:16 +08:00
是想扫一份全网的开放端口么 😮
|
9
RedFlag2233 OP @yukiww233 是的 :)
|
10
RedFlag2233 OP @imdong 是的,就是想记录所有的 IPV4 。能把您说的面试题的问题给一个参考链接吗?我去学习一下。
|
11
imdong 2021-05-31 16:02:03 +08:00
啊这,我随便说的,之前的面试题大概是这样的:
大量 url 去重但内存有限怎么做. 你这个思路就是 255.255.255.255:65535 可以对应到一个内存 /文件地址上. 0xFFFFFFFF-0xFFFF 上,开放 1,不开放 0. |
12
Akkuman 2021-05-31 23:07:52 +08:00 via Android
ipv4 用 int 存,因为 ipv4 是 32 位的数,这个可以直接定义为主键,然后 port 可以用 smallint 存,16 位,也可以定义为主键,然后看你是用中间表多对多关联,还是像上面说的 port 存成一个 list,还是怎样存,看你的查询需求了
|
13
qyvlik 2021-06-01 08:52:50 +08:00
ipv4 用 int 存,一个 ip 的可用端口数的理论值是 65535 左右,用 bitmap + 压缩保存。
然后查询可以用 redis 的 位操作命令加速。 |