在一些大数据处理中,我们需要用到IP地址查询,一般为了查询一个IP属于哪个地址,我们通常需要根据一个IP数据库来查询,网络上比较常用的IP库是纯真IP数据库。IP数据库里面的记录一般存储方式为IP的开始和结束的数字段,比如 "221.179.172.1-221.179.175.254 中国移动/北京市" 我们通常把IP转换为长整型存储为"3719539713,3719540734,中国移动,北京市",我们查询的时候就可以 先把IP转换为长整型,然后去大于开始,小于结束这个条件去查询,但是一般IP数据库都有几十万条数据,我们去这样查询,即使建立索引或者全部放到内存查询,效率还是不太高,通常1秒查询几百次,看上去效率已经很高了,但是试想如果我要查询1亿次,就需要几百个小时,在做大数据量数据处理的时候,这个速度还是很慢的。

为了提高查询速度,我们引入redis,redis是目前热门的Nosql数据库,很多大的公司都在用,具体的用法大家可以查查资料,redis中有一种数据结构是有序集合 sortset,我的IP数据库可以转化为sortset存储, 一个sortset中存储所有的IP记录(所有的IP地址区间不允许重复),结构为value中存储IP的开始(长整型),结束(长整型),省份等,分别依照逗号隔开,score中存放的是IP的结束值(长整型)

 举例为

value                          score

1,5,中国移动,北京市       5

10,20,中国联通,上海市  20

比如我们查询一个IP,IP转化为长整型的数字为 2,然后我们查询的时候就通过sortset 的zrangebyscore ranges 2 +inf LIMIT 0 1 这样我们就查询出来大于2的第一条记录,这样我们查询出来记录为 “1,5,中国移动,北京市” 然后我们在判断一下 我们要查询的地址在不在 1,5之间,2在1,5之间,所以查出来了2对应的IP地址为中国移动北京市,再比如我们要查询的IP地址数字为 8,通过zrangebyscore ranges 8 +inf LIMIT 0 1 我们查询到了 10,20,中国联通,上海市,但是8不在10,20之间,所以查询不到此IP对应的地址。

通过这个思路,我写了个测试程序,100000次查询,IP记录172738条,耗时5.2秒左右,差不多一秒钟两万次,我在windows下测试的,机器配置(固态硬盘)为

redis记录:

程序运行结果

当然我这个模拟测试,不是真实的IP地址,如果换成真实的IP,差距多大,大家自行验证。

参考

https://groups.google.com/forum/#!topic/redis-db/lrYbkbxfQiQ

文章出处:http://www.cnblogs.com/weiguang3100/

在线工具:http://51tools.info

.NET 开发交流

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

基于redis的IP地址快速查询的更多相关文章

  1. 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息

    1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...

  2. redis技巧--IP地址查询对应城市

    场景: 根据IP地址判断用户所在地,虽然网上有好多篇了,但我记录一个一看就懂的,不用看超长文字再自己理解了. 我们有城市和IP地址段的对应关系,如: 上海: 202.127.0.0 ~ 202.127 ...

  3. 查询本地ip以及ip地址库查询

    四种方法查询本地ip from urllib2 import urlopen from json import load my_ip = urlopen('http://ip.42.pl/raw'). ...

  4. PHP利用纯真IP数据库在本地实现IP地址信息查询

    https://blog.csdn.net/myweishanli/article/details/45098693 准备工作: 建议本地IP地址数据库,请到http://www.cz88.net/这 ...

  5. 利用纯真ip地址库 查询 ip所属地

    1. 首先下周数据源,选择是纯真数据库:http://www.cz88.net/ 2. 安装后,打开软件,将数据导出为txt格式. 3. 处理数据,参照网上的文章(http://www.jb51.ne ...

  6. 使用python调用淘宝的ip地址库查询接口结合zabbix判断dnspod域名解析是否正确

    #encoding:utf-8 import socket import requests import json ''' 使用python结合zabbix判断dnspod域名解析是否正确 服务器分国 ...

  7. 大规模IP地址黑名单高性能查询实现

    嗯……前阵子接了个活儿,需要做一个基于IP地址黑名单的分流网关.刚接到的时候心想iptables不就行了么,没想到一看客户给的IP黑名单规模……我擦……上亿个…… 黑名单到了这个规模,就不得不考虑下优 ...

  8. 记一次企业级爬虫系统升级改造(六):基于Redis实现免费的IP代理池

    前言: 首先表示抱歉,春节后一直较忙,未及时更新该系列文章. 近期,由于监控的站源越来越多,就偶有站源做了反爬机制,造成我们的SupportYun系统小爬虫服务时常被封IP,不能进行数据采集. 这时候 ...

  9. Python实现IP地址归属地查询

    一.使用淘宝IP地址库查询 使用淘宝的Rest API,可以快速查询IP地址的归属地: 图00-淘宝IP地址库RestAPI使用说明 图01-使用淘宝免费IP地址库-查询IP归属地 存在问题:淘宝的免 ...

随机推荐

  1. HDU1465+递推

    经典的信封装信问题 f[ n ]  = ( n-1 ) * ( f[ n-1 ]+f[ n-2 ] ) #include<stdio.h> #include<string.h> ...

  2. tomcat 设置默认编码格式

    在tomcat目录下 conf文件夹下的server.xml中: <Connector port="80" protocol="HTTP/1.1"     ...

  3. 跨平台查询文件时间,如果超过7天,删除该文件(windows和linxu测试过)

    windows调用的是_stat函数,linux调用的是stat函数. #include <time.h> #include <sys/types.h> #include &l ...

  4. 分布式环境下的id生成方法

    分布式环境下的id生成方法   前几天研究数据库分表分库的问题,其中有一个关键的地方就是生成唯一键的问题,假如数据表有1亿条数据,而且还在不断的增加,这里我们就需要考虑到分表分库,假设我们采用Hash ...

  5. 第十七章 委托 第十八章 Attribute 第十九章 可空值类型

    1.委托揭秘 定义一个委托,编译器会生成一个继承自System.MulticastDelegate的类,所有的委托都继承自该类. 由于委托是类,所以能定义类的地方,都能定义委托. 委托内部有一个tar ...

  6. 中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2718 题意:优先直走,右 左 后.... ...

  7. hibernate实体的几种状态:

    hibernate实体的几种状态: 实体的生命周期中,实体主要经过瞬时(Transient),托管(Attatched或Managed),游离(Detached)和销毁(Removed)四个状态. 瞬 ...

  8. poj2192

    初看这道题,以为是先用SA和SC求LCS,再从SC中把SA剔除,看剩下来的是不是SB(……) 显然不对;因为SC与SA的公共子串不止一种,判断不一定正确. 于是考虑SC中每一个字符,如果能够匹配,那么 ...

  9. NET下RabbitMQ实践[示例篇]

    在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容.         今天将会介绍如果使用rabbitmq进行简单的消息入队, ...

  10. 从ramdisk根文件系统启动Linux成功

    这几天参考国嵌的实验手册和网上的资料完成了u-boot定制.内核定制.ramdisk根文件系统的制作,并成功.趁热打铁,总结一下.本文引用了很多网络上的文章,就不一一注明了.感谢各大侠的帮助,如有雷同 ...