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

场景:

根据IP地址判断用户所在地,虽然网上有好多篇了,但我记录一个一看就懂的,不用看超长文字再自己理解了。

我们有城市和IP地址段的对应关系,如:

上海: 202.127.0.0 ~ 202.127.4.255

北京: 122.200.64.0 ~ 122.207.255.255

此时如果用户的IP地址为122.202.2.0,我们就能根据这个表知道他的地址位于北京。

方法:

使用有序集合记录这个表,每个城市存储两条数据,一条是城市名对应的分数为最大IP地址。另一条是“#”加上城市名对应的分数为最小IP地址。

分析:

取大于当前IP的最近的上一个分数值,如果值是#开头,说明是某一个城市的最小IP,就是当前IP不在任何城市范围内,如果不是#开头,那IP就属于这个城市。

|----上海最大IP(80=>sh)
|----上海最小IP(50=>#sh)
|----北京最大IP(30=>bj)
|----北京最小IP(20=>#bj)

代码实现:

//先用ip2long把IP地址转为对应的十进制数,这里为了方便直接使用虚拟数字表示
$redis->zAdd(‘zset‘, 20, ‘#bj‘); //最小IP加#
$redis->zAdd(‘zset‘, 30, ‘bj‘);
$redis->zAdd(‘zset‘, 50, ‘#sh‘); //最小IP加#
$redis->zAdd(‘zset‘, 80, ‘sh‘);

//获取IP对应的城市
$cityIp = 34;
$b = $redis->zRangeByScore(‘zset‘, $cityIp, ‘+inf‘, array( ‘limit‘=>array(0,1) )); 

if ($b) {
    if (strpos($b[0], ‘#‘) === 0) {
        echo ‘城市不在‘;
    } else {
        echo ‘城市是‘,print_r($b);
    }
} else {
    echo ‘城市不存在‘;
}
时间: 2024-12-12 23:55:12

redis技巧--IP地址查询对应城市的相关文章

API之IP地址查询---权威的IP地址查询接口集合

原文地址:http://yushine.iteye.com/blog/1717586 推荐实用IP138 http://www.baidu.com/s?wd=IP&rsv_spt=1&issp=1&f=8&rsv_bp=0&ie=utf-8&tn=19045005_9_pg&rsv_enter=1&rsv_sug3=2&rsv_sug4=60&rsv_sug1=1&rsv_sug2=0&inputT=520  

几个免费IP地址查询API接口

1.IP地址查询接口:http://apis.juhe.cn/ip/ip2addr 要先去https://www.juhe.cn/docs/api/id/1申请APPKEY 2.新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪这个应该说是最不错的.并且返回的数据类型为可以自定义格式(默认为纯文本格式,根据format的参数定义,还可以返回JS.Json格式). 3.新浪多地域测试方法: http

IP地址查询脚本

晚上看新闻时无意看到了淘宝IP查询API的信息,然后就顺手写了一个IP地址查询的脚本来分享 先贴出淘宝IP查询API的使用方法,以供读者研究: 1. 请求接口(GET): /service/getIpInfo.php?ip=[ip地址字串] 2. 响应信息: (json格式的)国家 .省(自治区或直辖市).市(县).运营商 3. 返回数据格式: {"code":0,"data":{"ip":"210.75.225.254",&

PHP 根据IP地址获取所在城市

有这样的需求,需要根据用户的IP地址,定位用户所在的城市. 本文记录性文章,无逻辑性.有这样需求的朋友,可以直接拷贝使用.直接上代码,不需赘述. <?php header('Content-Type:text/html;Charset=utf-8'); function GetIp(){ $realip = ''; $unknown = 'unknown'; if (isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&

Android中由IP地址查询经纬度坐标的实例

大家都知道,根据IP地址就可以知道它所在的具体位置,在Android中同样可以由IP地址得到它的位置,即具体的地理经纬度坐标. 本文就直接以代码的方式演示如何根据IP地址查询地理经纬度坐标位置,下面的例子中演示的就是由58.192.32.1这个IP地址查询到其所在的经纬度坐标为(118.777802,32.061699). Java代码 package eoe.demo; import com.mapdigit.gis.DigitalMap; import com.mapdigit.gis.Ma

js根据ip地址获取所在城市

话不多说,直接贴代码! 将这段代码运行一下就OK了: <html xmlns=""> <head runat="server"> <title>根据IP地址获取所在城市</title> <scriptsrc="?format=js"type="text/ecmascript"></script> <script type="text/jav

根据IP地址查询所在地

using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Text.RegularExpressions; namespace AIMSCommon { /// <summary> /// 根据IP地址查询所在地 /// </summary> public class IPScanerHelper { #region 私有成员 private st

通过IP地址获取省份城市位置信息

private String mResult = null; private String mProvinceName; //省份 private String mChCityName; //城市 private int GET_CITY_SUCCESS = 1; private int GET_CITY_FAILURE = 2; //Handler接收到消息进行处理,取出需要的信息 privateHandler mHandler = new Handler() { public void ha

分享几个免费IP地址查询API接口

1.IP地址查询接口:http://apis.juhe.cn/ip/ip2addr 要先去https://www.juhe.cn/docs/api/id/1申请APPKEY 2.新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪这个应该说是最不错的.并且返回的数据类型为可以自定义格式(默认为纯文本格式,根据format的参数定义,还可以返回JS.Json格式). 3.新浪多地域测试方法: http