在一些大数据处理中,我们需要用到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. Why does yum return error: [Errno 256] No more mirrors to try ?

    https://access.redhat.com/solutions/203603 ISSUE yum update fails with the error : [Errno 256] No mo ...

  2. IText 生成简单表格(报表)doc文档 单元居中

    IText生成doc文档需要三个包:iTextAsian.jar,iText-rtf-2.1.4.jar,iText-2.1.4.jar 亲测无误,代码如下所示: import com.lowagie ...

  3. Linux下实现C++类的动态链接

    1. 背景 在java中,jvm支持类的动态链接(Class.forName(String className)),用起来也很方便.动态链接是实现IOC(Inversion of Control,控制 ...

  4. Java开发之File类

    File类 File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读.获取当 ...

  5. Android开发之点击两次Back键退出App

    Back按键的方法是onKeyDown()方法,重写该方法就可以改变back按键的作用. 实现点击两次Back按键退出app,有两种方法: 方法1. private static boolean is ...

  6. javascript 一些需要知道的东西

    这里我直接贴出代码,注释已经补全,欢迎指正: <script type="text/javascript"> /** 1,js中一切皆是对象,函数也是, 2,当定义变量 ...

  7. java高并发,如何解决,什么方式解决

    之前我将高并发的解决方法误认为是线程或者是队列可以解决,因为高并发的时候是有很多用户在访问,导致出现系统数据不正确.丢失数据现象,所以想到 的是用队列解决,其实队列解决的方式也可以处理,比如我们在竞拍 ...

  8. tomcat+nginx+redis实现均衡负载、session共享(一)

    在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一) ...

  9. 【C++】【斐波那契】求第几个斐波那契数字。

    首先在头文件 whichfibonaccinumber.h 中写了一个使用加法的解法.没有验证输入数字是否小于0. #ifndef WHICHFIBONACCINUMBER_H_ #define WH ...

  10. 陈正冲老师讲c语言之const关键字

    1.const 关键字也许该被替换为 readolny const是constant的缩写,是恒定不变的意思,也翻译为常量.常数等.很不幸,正是因为这一点,很多人都认为被const修饰的值是常量.这是 ...