最近、プロジェクトの特定の機能は、IPアドレスに基づいてサードパーティインターフェイスから詳細な地理的位置を取得する必要があります。 Sina、Taobao、Tencentなど、インターネットから多くの例を見つけました。タオバオを試しました。それがほんの数桁である場合、それは大丈夫です。 100,000のレベルに達すると、速度が遅くなり、システムがクラッシュします。次の例はSinaからです。この例は各プロジェクトに適しておらず、変更する必要があります。
/** ipsearchurl = http://int.dpool.sina.com.cn/iplookup/iplookup.php?format = js&ip =(これはSinaのインターフェイスアドレスです)プロジェクトでは、Sinaのインターフェイスアドレスは直接記述されていませんが、属性ファイルは読み取られます。 */ public static string getipinfobysina(string ip){//属性ファイル(プロパティファイルkey-value and format)final string prop_ipsearchurl = "ipsearchurl";最終文字列ret_success = "1";最終文字列ret = "ret"; final string province = "province";最終文字列city = "City";最終文字列地区= "地区";最終文字列ISP = "ISP";文字列iPaddress = ""; if(stringutils.isblank(ip)){return null; } string url = systemparampropertyutils.getSystemParamkeyValue(prop_ipsearchurl); //これは、プロパティファイルからURLを取得するためです。 path = url+ip; // "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip="+ip; httpclient httpclient = new httpclient(); map <string、string> parammap = new hashmap <string、string>();文字列remoteipinfo = ""; try {remoteIpinfo = httpclientutil.request(httpclient、path、parammap、 "sina"); } catch(Exception e){e.printstacktrace(); } if(stringutils.isnotblank(remoteipinfo)){string _ret = searchValue(remoteIpinfo、ret); if(ret_success.equals(_ret)){string provincename = searchValue(remoteIpInfo、州); string cityName = searchValue(remoteIpinfo、city);文字列district = searchValue(remoteIpinfo、地区);文字列ISP = SearchValue(remoteIpInfo、ISP); iPaddress = provencename+cityName+District+ISP; }}} iPaddressを返します。 } private static string searchValue(string remoteipinfo、string key){string _value = ""; if(stringutils.isnotblank(remoteipinfo)){_value = stringutils.substringbetween(remoteipinfo、 "/" "+key+"/":"、 "、"); if(stringutils.isnotblank(_value)){_value = unicodeutils.decodeunicode(_value); }} return _value; } Sinaインターフェイスアドレスを非常に迅速に読みました。約90,000、10分間テストしました。タオバオの場合、1時間以上、50,000個以上。読み取りIPをマップに保存し、次回読んだ場合はマップから直接取り出すことです。これははるかに高速です。これは多くの問題につながります。ログファイルが数百万または数千万人に届くと、それらを解決する方法は? Taobaoのような例の場合、各注文は1秒で注文数が異なります。それを解決する方法がわかりません。いくつかの偉大な神は私に返事をすることを知っています。
以下はタオバオです。
java.io.bufferedreader; Import java.io.dataoutputStream; Import java.io.ioexception; Import java.io.inputStreamReader; Impont java.io.unsuptedencodingexception; Import java.net.net.httpurlconnection; Import java.net.net.net.urllをインポートします。 @author lwl * @datejan 26、2016 * /public class destordutils { /** * @param content *要求されたパラメーター形式は次のとおりです。たとえば、GBK、UTF-8など// IPがhttp://whois.pconline.com.cn string returnstr = this.getResult(urlstr、content、encodingstring)からIPが配置されている州、市、地区の情報を取得します。 if(returnstr!= null){//返された地方および市の情報システムを処理します。 string [] temp = returnstr.split( "、"); if(temp.length <3){return "0"; //無効なIP、LANテスト} string region =(temp [5] .split( ":"))[1] .ReplaceAll( "/" "、" "); region = decodeunicode(region)(領域); // contion =" = "";国= decodeunicode(country); // country break;ケース3:領域=(temp [i] .split( ":"))[1] .replaceall( "/" ""、 ""); area = decodeunicode(領域); //領域ブレーク;ケース5:領域=(temp [i] .split( ":"))[1] .replaceall( "/" ""、 ""); region = decodeunicode(region); // staving break;ケース7:city =(temp [i] .split( ":"))[1] .replaceall( "/" "、" "); city = decodeunicode(city); // city break; case 9:county =(temp [i] .split(": "))[1] .replaceall("/"" "" "");郡= decodeunicode(郡); //リージョンブレイク;ケース11:isp =(temp [i] .split( ":"))[1] .replaceall( "/" "、" "); isp = decodeunicode(ISP); // ISP Company Break;}} System.out.println(国+エリア+地域+都市+郡+郡+ISP); StringBuffer(country).append .append(city).append(ISP).toString()} @param urlstr * @param Content * GBK、UTF-8などConnection.setConnectTimeout(2000); // Milliseconds Connection.setReadTimeOut(33000); ///データを読み取るためのタイムアウトをMilliseconds Connection.setDoOutput(true); //出力ストリームを開くかどうか真)メソッドを投稿する| connection.setuseCaches(false); // true | false connection.connect(); // connection portputputStream out = new DataUtputStream())を開くかどうか(Connection.getOutputStream(); out.flush(); // refresh.close(); //出力ストリームBufferedReader reader = new bufferedReader(new inputstreamReader(connection.getInputStream()、エンコード));文字列line = ""; while((line = reader.readline())!= null){buffer.append(line); } reader.close(); return buffer.toString(); } catch(ioexception e){e.printstacktrace(); }最後に{if(connection!= null){connection.disconnect(); //接続を閉じる}} nullを返します。 } / ** * unicodeは中国語に変換 * * * @author fanhui 2007-3-15 * @param thestring * @return * / public static string decodeunicode(string thestring){char achar; int len = thestring.length(); stringbuffer outbuffer = new StringBuffer(len); for(int x = 0; x <len;){achar = thestring.charat(x ++); if(achar == '//'){achar = thestring.charat(x ++); if(achar == 'u'){int value = 0; for(int i = 0; i <4; i ++){achar = thestring.charat(x ++); switch(achar){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':value =(value << 4) + achar- '0';壊す; case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value =(value << 4) + 10 + achar- 'a';壊す; case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value =(value << 4) + 10 + achar- 'a';壊す; case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value =(value << 4) + 10 + achar- 'a';壊す;デフォルト:新しいIllegalargumentException( "Malformed Encoding。"); }} outbuffer.append(((char)value); } else {if(achar == 't'){achar = '/t'; } else if(achar == 'r'){achar = '/r'; } else if(achar == 'n'){achar = '/n'; } else if(achar == 'f'){achar = '/f'; } outbuffer.append(achar); }} else {outbuffer.append(achar); }} return outbuffer.toString(); } // public static void main(string [] args){addressutils destordutils = new destordutils(); //テストIP 219.136.134.157中国=南中国=広東省=広州市= yuexiu地区=テレコム文字列ip = "125.70.11.136";文字列アドレス= ""; try {address = addressutils.getAddresses( "ip ="+ip、 "utf-8"); } catch(unsupportedencodingexception e){// todo auto-enerated catch block e.printstacktrace(); } system.out.println(address); //出力の結果は次のとおりです。