Day_35 IP归属地查询V2

本文档描述了一个IP归属地查询系统的实现过程,包括文本文件读取工具类的封装、数据结构化、IP地址对象的排序与二分法查询。针对IP字符串比较问题,通过转换为long类型解决,并利用静态代码块优化性能。此外,还讨论了正则表达式进行输入校验,以及序列化和反序列化来减少重复结构化操作,进一步提升系统性能。
摘要由CSDN通过智能技术生成

说一下大体思路

首先无脑读取文件

        定义文件路径

        通过节点流对接到文本上

        将节点流转换为字符流

        通过缓冲流对接到输入流

        读取

        关闭流

文本文件读取工具类

        工具类封装 :

                1 先写测试类,确认输入与输出技术问题

                2 抽象出了输入与输出,形成方法的入参和出参

                3 工具代码实现,测试

数据结构化

        1 可以找无结构化数据的组织规则,进行抽象,转换为结构化

        2 根据数据组织进行数据抽象

        3 解析数据,保存到对应的对象中

抽象pojo类

        抽象封装

                结构化实体类

        数据拆分,转换为对象

封装DataProcessManager类

        把数据封装到对象中并保存list里面

结构化集合转换为数组

对象数组排序

        实现排序

        排序注意事项

            被排序的元素必须具有可比性

            实现Comparable接口

            有比较器类Comparator

业务问题

        由于IP是字符串,而字符串比较ASCII码

        比如 1.1.6.32  , 1.1.128.23 理论上应该是后面的大

        但是按照ASCII码比较的话,前面的大

        所以我们需要把IP转换为long类型进行比较即可

Pojo添加衍生字段

        实体类中衍生两个字段,用来存储转换为long类型之后的值

封装方法,测试

二分法

        二分法查询,必须建立在已排序的基础上

        基本类型

        引用/复杂类型

        业务类实现

 IP地址对象的范围形式数据的二分法实现

         业务类功能实现

工具类封装

        到目前为止,已经把二分法搞定了,已经可以实现功能了,测试代码就相当于客户端

        但是目前客户端知道的信息还是比较多,客户只关心 入参和出参是什么就可以

        至于我们用什么编码,用什么存储,客户根本不关心

        此时我们需要提供一个对外访问的方法,该方法入参就是IP 出参就是归属地

优化

        功能实现了,像以下情况,同一个生命周期中,如果操作两次及两次以上

        那么 会导致 ip_location_relation地址库被解析多次,并且结构化多次,并且排序多次带来的性能变弱

        因为在一个生命周期当前,只解析一次,结构化一次,排序一次即可,每次获取归属地的时候,只需 要进行二分法操作即可

        可以使用静态代码块解决

入口类,给一个入口运行

 BUG优化

        用户输入 需要严格校验,比如IP地址不正确,还有必要去查询吗?

        技术问题

        正则表达式

                Pattern和Matcher

                Pattern是正则表达式引擎

                Matcher是匹配器

                Matches : 全词匹配

                Find : 任意位置

                lookingAt : 从前往后匹配

封装、测试工具类

性能调优

         相关技术

                 硬件

                        内存,CPU.磁盘,网络等 都可以实现性能提高

                软件

                         直接调优

                        哪里慢,就调哪里,不需要花里胡哨的

                        主要指算法问题,内核层面,难度较大,大部分都是非直接调优

                        迂回调优

                        通过设计,策略,可以通过不用面对底层优化的难题

迂回调优方向

        缓存策略

        通过添加时间断点,测试得出,结构化耗时较多

        一开始,我们一次运行中,先后校验两个IP,需要结构化两次

        后来我们使用静态语句块解决了这个问题

        做到一次生命周期中,只会结构化一次

        现在面临的问题是,需要让多次生命周期,使用同一个结构化之后的对象,就可以解决当前的问题

        可以使用序列化和反序列化解决

序列化和反序列化

        序列化 : 将内存中对象保存到硬盘中

        反序列化 : 把硬盘中对象载入到内存

首次调优

        技术问题

        被序列化的对象必须实现serlizable接口

封装、测试工具类

初始化优化

        只有第一次才序列化,其余的都反序列化即可

        判断该文件是否存在,如果存在,就反序列化获取,如果不存在,就序列化写出

IO调优

        加入序列化和反序列化之后,导致效率更低,并且第二个运行要比第一次还慢,说明反序列化有问题

        缓冲流 : 缓冲流是IO流的缓冲区,用来提高IO的效率

引入缓冲流

调用处更改

代码标准化

        代码中,出现了好多这些变量,当我们需要更改某一个的时候,不好找

        集中管理

StaticValue

优化进阶

IO优化

        直接优化 : 提高IO效率

        间接优化 : 数据大小也会应该效率问题

        文件大小变动

        首次2500 非首次 520-600

 以上就是全部的整体思路,主要就是把以前所学过的知识串联起来,比较有挑战性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值