{"id":201484,"date":"2025-05-10T11:17:09","date_gmt":"2025-05-10T03:17:09","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201484\/"},"modified":"2025-05-10T11:17:09","modified_gmt":"2025-05-10T03:17:09","slug":"%e6%90%9e%e5%ae%9a%ef%bc%81redis%e5%ae%9e%e7%8e%b0%e9%99%84%e8%bf%91%e7%9a%84%e4%ba%ba%e5%8a%9f%e8%83%bd","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201484\/","title":{"rendered":"\u641e\u5b9a\uff01Redis\u5b9e\u73b0\u201c\u9644\u8fd1\u7684\u4eba\u201d\u529f\u80fd"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>\u641e\u5b9a\uff01Redis\u5b9e\u73b0\u201c\u9644\u8fd1\u7684\u4eba\u201d\u529f\u80fd<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p><span style=\"color: #222222;font-family:\">\u5404\u4f4d\u5c0f\u4f19\u4f34\u4eec\uff0c\u5927\u5bb6\u597d\u5440\uff01\u770b\u770b\u4eca\u5929\u6211\u53c8\u7ed9\u5404\u4f4d\u5e26\u6765\u4e86\u4ec0\u4e48\u6587\u7ae0\uff1f\u672c\u6587\u6807\u9898<span style=\"color: #222222;font-family:\">\u662f<\/span><span style=\"color: #FF6600;font-family:\">\u300a\u641e\u5b9a\uff01Redis\u5b9e\u73b0\u201c\u9644\u8fd1\u7684\u4eba\u201d\u529f\u80fd\u300b<\/span>\uff0c\u5f88\u660e\u663e\u662f\u5173\u4e8e<span style=\"color: #FF6600;font-family:\">\u6570\u636e\u5e93<\/span>\u7684\u6587\u7ae0\u54c8\u54c8\u54c8\uff0c\u5176\u4e2d\u5185\u5bb9\u4e3b\u8981\u4f1a\u6d89\u53ca\u5230<span style=\"color: #FF6600;font-family:\">MySQL\u3001Redis\u3001mongodb<\/span>\u7b49\u7b49\uff0c\u5982\u679c\u80fd\u5e2e\u5230\u4f60\uff0c\u89c9\u5f97\u5f88\u4e0d\u9519\u7684\u8bdd\uff0c\u6b22\u8fce\u5404\u4f4d\u591a\u591a\u70b9\u8bc4\u548c\u5206\u4eab\uff01<\/span><\/p>\n<p>&nbsp;\u9488\u5bf9\u201c\u9644\u8fd1\u7684\u4eba\u201d\u8fd9\u4e00\u4f4d\u7f6e\u670d\u52a1\u9886\u57df\u7684\u5e94\u7528\u573a\u666f\uff0c\u5e38\u89c1\u7684\u53ef\u4f7f\u7528 PG\u3001MySQL \u548c MongoDB \u7b49\u591a\u79cd DB \u7684\u7a7a\u95f4\u7d22\u5f15\u8fdb\u884c\u5b9e\u73b0\u3002<\/p>\n<\/p>\n<p>\u56fe\u7247\u6765\u81ea Pexels&nbsp;<\/p>\n<\/p>\n<p>\u800c Redis \u53e6\u8f9f\u8e4a\u5f84\uff0c\u7ed3\u5408\u5176\u6709\u5e8f\u961f\u5217 ZSET \u4ee5\u53ca GEOHASH \u7f16\u7801\uff0c\u5b9e\u73b0\u4e86\u7a7a\u95f4\u641c\u7d22\u529f\u80fd\uff0c\u4e14\u62e5\u6709\u6781\u9ad8\u7684\u8fd0\u884c\u6548\u7387\u3002<\/p>\n<p>\u672c\u6587\u5c06\u4ece\u6e90\u7801\u89d2\u5ea6\u5bf9\u5176\u7b97\u6cd5\u539f\u7406\u8fdb\u884c\u89e3\u6790\uff0c\u5e76\u63a8\u7b97\u67e5\u8be2\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u8981\u63d0\u4f9b\u5b8c\u6574\u7684\u201c\u9644\u8fd1\u7684\u4eba\u201d\u670d\u52a1\uff0c\u6700\u57fa\u672c\u7684\u662f\u8981\u5b9e\u73b0\u201c\u589e\u201d\u3001\u201c\u5220\u201d\u3001\u201c\u67e5\u201d\u7684\u529f\u80fd\u3002<\/p>\n<p>\u4ee5\u4e0b\u5c06\u5206\u522b\u8fdb\u884c\u4ecb\u7ecd\uff0c\u5176\u4e2d\u4f1a\u91cd\u70b9\u5bf9\u67e5\u8be2\u529f\u80fd\u8fdb\u884c\u89e3\u6790\u3002<\/p>\n<p><strong><span style=\"font-size: x-large\">\u64cd\u4f5c\u547d\u4ee4<\/span><\/strong><\/p>\n<p>\u81ea Redis 3.2 \u5f00\u59cb\uff0cRedis \u57fa\u4e8e GEOHASH \u548c\u6709\u5e8f\u96c6\u5408\u63d0\u4f9b\u4e86\u5730\u7406\u4f4d\u7f6e\u76f8\u5173\u529f\u80fd\u3002<\/p>\n<p>Redis Geo \u6a21\u5757\u5305\u542b\u4e86\u4ee5\u4e0b 6 \u4e2a\u547d\u4ee4\uff1a<\/p>\n<ul>\n<li>\n<p>GEOADD\uff1a\u5c06\u7ed9\u5b9a\u7684\u4f4d\u7f6e\u5bf9\u8c61(\u7eac\u5ea6\u3001\u7ecf\u5ea6\u3001\u540d\u5b57)\u6dfb\u52a0\u5230\u6307\u5b9a\u7684 Key\u3002<\/p>\n<\/li>\n<li>\n<p>GEOPOS\uff1a\u4ece Key \u91cc\u9762\u8fd4\u56de\u6240\u6709\u7ed9\u5b9a\u4f4d\u7f6e\u5bf9\u8c61\u7684\u4f4d\u7f6e(\u7ecf\u5ea6\u548c\u7eac\u5ea6)\u3002<\/p>\n<\/li>\n<li>\n<p>GEODIST\uff1a\u8fd4\u56de\u4e24\u4e2a\u7ed9\u5b9a\u4f4d\u7f6e\u4e4b\u95f4\u7684\u8ddd\u79bb\u3002<\/p>\n<\/li>\n<li>\n<p>GEOHASH\uff1a\u8fd4\u56de\u4e00\u4e2a\u6216\u591a\u4e2a\u4f4d\u7f6e\u5bf9\u8c61\u7684 GeoHASH \u8868\u793a\u3002<\/p>\n<\/li>\n<li>\n<p>GEORADIUS\uff1a\u4ee5\u7ed9\u5b9a\u7684\u7ecf\u7eac\u5ea6\u4e3a\u4e2d\u5fc3\uff0c\u8fd4\u56de\u76ee\u6807\u96c6\u5408\u4e2d\u4e0e\u4e2d\u5fc3\u7684\u8ddd\u79bb\u4e0d\u8d85\u8fc7\u7ed9\u5b9a\u6700\u5927\u8ddd\u79bb\u7684\u6240\u6709\u4f4d\u7f6e\u5bf9\u8c61\u3002<\/p>\n<\/li>\n<li>\n<p>GEORADIUSBYMEMBER\uff1a\u4ee5\u7ed9\u5b9a\u7684\u4f4d\u7f6e\u5bf9\u8c61\u4e3a\u4e2d\u5fc3\uff0c\u8fd4\u56de\u4e0e\u5176\u8ddd\u79bb\u4e0d\u8d85\u8fc7\u7ed9\u5b9a\u6700\u5927\u8ddd\u79bb\u7684\u6240\u6709\u4f4d\u7f6e\u5bf9\u8c61\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u5176\u4e2d\uff0c\u7ec4\u5408\u4f7f\u7528 GEOADD \u548c GEORADIUS \u53ef\u5b9e\u73b0\u201c\u9644\u8fd1\u7684\u4eba\u201d\u4e2d\u201c\u589e\u201d\u548c\u201c\u67e5\u201d\u7684\u57fa\u672c\u529f\u80fd\u3002<\/p>\n<p>\u8981\u5b9e\u73b0\u5fae\u4fe1\u4e2d\u201c\u9644\u8fd1\u7684\u4eba\u201d\u529f\u80fd\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528 GEORADIUSBYMEMBER \u547d\u4ee4\u3002\u5176\u4e2d\u201c\u7ed9\u5b9a\u7684\u4f4d\u7f6e\u5bf9\u8c61\u201d\u5373\u4e3a\u7528\u6237\u672c\u4eba\uff0c\u641c\u7d22\u7684\u5bf9\u8c61\u4e3a\u5176\u4ed6\u7528\u6237\u3002<\/p>\n<p>\u4e0d\u8fc7\u672c\u8d28\u4e0a\uff0cGEORADIUSBYMEMBER=GEOPOS+GEORADIUS\uff0c\u5373\u5148\u67e5\u627e\u7528\u6237\u4f4d\u7f6e\u518d\u901a\u8fc7\u8be5\u4f4d\u7f6e\u641c\u7d22\u9644\u8fd1\u6ee1\u8db3\u4f4d\u7f6e\u76f8\u4e92\u8ddd\u79bb\u6761\u4ef6\u7684\u5176\u4ed6\u7528\u6237\u5bf9\u8c61\u3002<\/p>\n<p>\u4ee5\u4e0b\u4f1a\u4ece\u6e90\u7801\u89d2\u5ea6\u5165\u624b\u5bf9 GEOADD \u548c GEORADIUS \u547d\u4ee4\u8fdb\u884c\u5206\u6790\uff0c\u5256\u6790\u5176\u7b97\u6cd5\u539f\u7406\u3002<\/p>\n<p>Redis Geo \u64cd\u4f5c\u4e2d\u53ea\u5305\u542b\u4e86\u201c\u589e\u201d\u548c\u201c\u67e5\u201d\u7684\u64cd\u4f5c\uff0c\u5e76\u6ca1\u6709\u4e13\u95e8\u7684\u201c\u5220\u9664\u201d\u547d\u4ee4\u3002\u4e3b\u8981\u662f\u56e0\u4e3a Redis \u5185\u90e8\u4f7f\u7528\u6709\u5e8f\u96c6\u5408(ZSET)\u4fdd\u5b58\u4f4d\u7f6e\u5bf9\u8c61\uff0c\u53ef\u7528 &nbsp;ZREM \u8fdb\u884c\u5220\u9664\u3002<\/p>\n<p>\u5728 Redis \u6e90\u7801 geo.c \u7684\u6587\u4ef6\u6ce8\u91ca\u4e2d\uff0c\u53ea\u8bf4\u660e\u4e86\u8be5\u6587\u4ef6\u4e3a GEOADD\u3001GEORADIUS \u548c GEORADIUSBYMEMBER &nbsp;\u7684\u5b9e\u73b0\u6587\u4ef6(\u5176\u5b9e\u4e5f\u5b9e\u73b0\u4e86\u53e6\u4e09\u4e2a\u547d\u4ee4)\u3002\u4ece\u4fa7\u9762\u770b\u51fa\u5176\u4ed6\u4e09\u4e2a\u547d\u4ee4\u4e3a\u8f85\u52a9\u547d\u4ee4\u3002<\/p>\n<p><strong><span style=\"font-size: x-large\">GEOADD<\/span><\/strong><\/p>\n<p><strong><span style=\"font-size: large\">\u4f7f\u7528\u65b9\u5f0f<\/span><\/strong><\/p>\n<\/p>\n<pre>GEOADD&nbsp;key&nbsp;longitude&nbsp;latitude&nbsp;member&nbsp;[longitude&nbsp;latitude&nbsp;member&nbsp;...]<\/pre>\n<\/p>\n<p>\u5c06\u7ed9\u5b9a\u7684\u4f4d\u7f6e\u5bf9\u8c61(\u7eac\u5ea6\u3001\u7ecf\u5ea6\u3001\u540d\u5b57)\u6dfb\u52a0\u5230\u6307\u5b9a\u7684 Key\u3002\u5176\u4e2d\uff0cKey \u4e3a\u96c6\u5408\u540d\u79f0\uff0cMember \u4e3a\u8be5\u7ecf\u7eac\u5ea6\u6240\u5bf9\u5e94\u7684\u5bf9\u8c61\u3002<\/p>\n<p>\u5728\u5b9e\u9645\u8fd0\u7528\u4e2d\uff0c\u5f53\u6240\u9700\u5b58\u50a8\u7684\u5bf9\u8c61\u6570\u91cf\u8fc7\u591a\u65f6\uff0c\u53ef\u901a\u8fc7\u8bbe\u7f6e\u591a Key(\u5982\u4e00\u4e2a\u7701\u4e00\u4e2a Key)\u7684\u65b9\u5f0f\u5bf9\u5bf9\u8c61\u96c6\u5408\u53d8\u76f8\u505a &nbsp;Sharding\uff0c\u907f\u514d\u5355\u96c6\u5408\u6570\u91cf\u8fc7\u591a\u3002<\/p>\n<p>\u6210\u529f\u63d2\u5165\u540e\u7684\u8fd4\u56de\u503c\uff1a<\/p>\n<\/p>\n<pre>(integer)&nbsp;N<\/pre>\n<\/p>\n<p>\u5176\u4e2d N \u4e3a\u6210\u529f\u63d2\u5165\u7684\u4e2a\u6570\u3002<\/p>\n<p><strong><span style=\"font-size: large\">\u6e90\u7801\u5206\u6790<\/span><\/strong><\/p>\n<\/p>\n<pre>\/*&nbsp;GEOADD&nbsp;key&nbsp;long&nbsp;lat&nbsp;name&nbsp;[long2&nbsp;lat2&nbsp;name2&nbsp;...&nbsp;longN&nbsp;latN&nbsp;nameN]&nbsp;*\/&nbsp;\r\nvoid&nbsp;geoaddCommand(client&nbsp;*c)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Check&nbsp;arguments&nbsp;number&nbsp;for&nbsp;sanity.&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((c-&gt;argc&nbsp;-&nbsp;2)&nbsp;%&nbsp;3&nbsp;!=&nbsp;0)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Need&nbsp;an&nbsp;odd&nbsp;number&nbsp;of&nbsp;arguments&nbsp;if&nbsp;we&nbsp;got&nbsp;this&nbsp;far...&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addReplyError(c,&nbsp;\"syntax&nbsp;error.&nbsp;Try&nbsp;GEOADD&nbsp;key&nbsp;[x1]&nbsp;[y1]&nbsp;[name1]&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"[x2]&nbsp;[y2]&nbsp;[name2]&nbsp;...&nbsp;\");&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;\r\n\/\/\u53c2\u6570\u63d0\u53d6Redis&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;elements&nbsp;=&nbsp;(c-&gt;argc&nbsp;-&nbsp;2)&nbsp;\/&nbsp;3;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;argc&nbsp;=&nbsp;2+elements*2;&nbsp;\/*&nbsp;ZADD&nbsp;key&nbsp;score&nbsp;ele&nbsp;...&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;robj&nbsp;**argv&nbsp;=&nbsp;zcalloc(argc*sizeof(robj*));&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;argv[0]&nbsp;=&nbsp;createRawStringObject(\"zadd\",4);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;argv[1]&nbsp;=&nbsp;c-&gt;argv[1];&nbsp;\/*&nbsp;key&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;incrRefCount(argv[1]);&nbsp;\r\n\/\/\u53c2\u6570\u904d\u5386+\u8f6c\u6362&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Create&nbsp;the&nbsp;argument&nbsp;vector&nbsp;to&nbsp;call&nbsp;ZADD&nbsp;in&nbsp;order&nbsp;to&nbsp;add&nbsp;all&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;score,value&nbsp;pairs&nbsp;to&nbsp;the&nbsp;requested&nbsp;zset,&nbsp;where&nbsp;score&nbsp;is&nbsp;actually&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;an&nbsp;encoded&nbsp;version&nbsp;of&nbsp;lat,long.&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;argv+2)+(i*3),xy)&nbsp;==&nbsp;C_ERR)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;argv[2&nbsp;+&nbsp;i&nbsp;*&nbsp;3&nbsp;+&nbsp;2];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argv[2+i*2]&nbsp;=&nbsp;score;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argv[3+i*2]&nbsp;=&nbsp;val;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;incrRefCount(val);&nbsp;\r\n\/\/\u8c03\u7528zadd\u547d\u4ee4\uff0c\u5b58\u50a8\u8f6c\u5316\u597d\u7684\u5bf9\u8c61&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Finally&nbsp;call&nbsp;ZADD&nbsp;that&nbsp;will&nbsp;do&nbsp;the&nbsp;work&nbsp;for&nbsp;us.&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;replaceClientCommandVector(c,argc,argv);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;zaddCommand(c);<\/pre>\n<\/p>\n<p>\u901a\u8fc7\u6e90\u7801\u5206\u6790\u53ef\u4ee5\u770b\u51fa Redis \u5185\u90e8\u4f7f\u7528\u6709\u5e8f\u96c6\u5408(ZSET)\u4fdd\u5b58\u4f4d\u7f6e\u5bf9\u8c61\uff0c\u6709\u5e8f\u96c6\u5408\u4e2d\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u5e26\u4f4d\u7f6e\u7684\u5bf9\u8c61\uff0c\u5143\u7d20\u7684 Score \u503c\u4e3a\u5176\u7ecf\u7eac\u5ea6\u5bf9\u5e94\u7684 &nbsp;52 \u4f4d\u7684 GEOHASH \u503c\u3002<\/p>\n<p>Double \u7c7b\u578b\u7cbe\u5ea6\u4e3a 52 \u4f4d;GEOHASH \u662f\u4ee5 base32 \u7684\u65b9\u5f0f\u7f16\u7801\uff0c52bits \u6700\u9ad8\u53ef\u5b58\u50a8 10 \u4f4d GEOHASH &nbsp;\u503c\uff0c\u5bf9\u5e94\u5730\u7406\u533a\u57df\u5927\u5c0f\u4e3a 0.6*0.6 \u7c73\u7684\u683c\u5b50\u3002<\/p>\n<p>\u6362\u53e5\u8bdd\u8bf4\u7ecf Redis Geo \u8f6c\u6362\u8fc7\u7684\u4f4d\u7f6e\u7406\u8bba\u4e0a\u4f1a\u6709\u7ea6 0.3*1.414=0.424 \u7c73\u7684\u8bef\u5dee\u3002<\/p>\n<p><strong><span style=\"font-size: large\">\u7b97\u6cd5\u5c0f\u7ed3<\/span><\/strong><\/p>\n<p>\u7b80\u5355\u603b\u7ed3\u4e0b GEOADD \u547d\u4ee4\u90fd\u5e72\u4e86\u5565\uff1a<\/p>\n<ul>\n<li>\n<p>\u53c2\u6570\u63d0\u53d6\u548c\u6821\u9a8c<\/p>\n<\/li>\n<li>\n<p>\u5c06\u5165\u53c2\u7ecf\u7eac\u5ea6\u8f6c\u6362\u4e3a 52 \u4f4d\u7684 GEOHASH \u503c(Score)<\/p>\n<\/li>\n<li>\n<p>\u8c03\u7528 ZADD \u547d\u4ee4\u5c06 Member \u53ca\u5176\u5bf9\u5e94\u7684 Score \u5b58\u5165\u96c6\u5408 Key \u4e2d\u3002<\/p>\n<\/li>\n<\/ul>\n<p><span style=\"font-size: x-large\"><strong>GEORADIUS<\/strong><\/span><\/p>\n<p><strong><span style=\"font-size: large\">\u4f7f\u7528\u65b9\u5f0f<\/span><\/strong><\/p>\n<\/p>\n<pre>GEORADIUS&nbsp;key&nbsp;longitude&nbsp;latitude&nbsp;radius&nbsp;m|km|ft|mi&nbsp;[WITHCOORD]&nbsp;[WITHDIST]&nbsp;[WITHHASH]&nbsp;[ASC|DESC]&nbsp;[COUNT&nbsp;count]&nbsp;[STORE&nbsp;key]&nbsp;[STORedisT&nbsp;key]<\/pre>\n<\/p>\n<p>\u4ee5\u7ed9\u5b9a\u7684\u7ecf\u7eac\u5ea6\u4e3a\u4e2d\u5fc3\uff0c\u8fd4\u56de\u76ee\u6807\u96c6\u5408\u4e2d\u4e0e\u4e2d\u5fc3\u7684\u8ddd\u79bb\u4e0d\u8d85\u8fc7\u7ed9\u5b9a\u6700\u5927\u8ddd\u79bb\u7684\u6240\u6709\u4f4d\u7f6e\u5bf9\u8c61\u3002<\/p>\n<p>\u8303\u56f4\u5355\u4f4d\uff1am | km | ft | mi &#8211;&gt; \u7c73 | \u5343\u7c73 | \u82f1\u5c3a | \u82f1\u91cc<\/p>\n<p>\u989d\u5916\u53c2\u6570\uff1a<\/p>\n<ul>\n<li>\n<p>WITHDIST\uff1a\u5728\u8fd4\u56de\u4f4d\u7f6e\u5bf9\u8c61\u7684\u540c\u65f6\uff0c\u5c06\u4f4d\u7f6e\u5bf9\u8c61\u4e0e\u4e2d\u5fc3\u4e4b\u95f4\u7684\u8ddd\u79bb\u4e5f\u4e00\u5e76\u8fd4\u56de\u3002\u8ddd\u79bb\u7684\u5355\u4f4d\u548c\u7528\u6237\u7ed9\u5b9a\u7684\u8303\u56f4\u5355\u4f4d\u4fdd\u6301\u4e00\u81f4\u3002<\/p>\n<\/li>\n<li>\n<p>WITHCOORD\uff1a\u5c06\u4f4d\u7f6e\u5bf9\u8c61\u7684\u7ecf\u5ea6\u548c\u7ef4\u5ea6\u4e5f\u4e00\u5e76\u8fd4\u56de\u3002<\/p>\n<\/li>\n<li>\n<p>WITHHASH\uff1a\u4ee5 52 \u4f4d\u6709\u7b26\u53f7\u6574\u6570\u7684\u5f62\u5f0f\uff0c\u8fd4\u56de\u4f4d\u7f6e\u5bf9\u8c61\u7ecf\u8fc7\u539f\u59cb GEOHASH &nbsp;\u7f16\u7801\u7684\u6709\u5e8f\u96c6\u5408\u5206\u503c\u3002\u8fd9\u4e2a\u9009\u9879\u4e3b\u8981\u7528\u4e8e\u5e95\u5c42\u5e94\u7528\u6216\u8005\u8c03\u8bd5\uff0c\u5b9e\u9645\u4e2d\u7684\u4f5c\u7528\u5e76\u4e0d\u5927\u3002<\/p>\n<\/li>\n<li>\n<p>ASC|DESC\uff1a\u4ece\u8fd1\u5230\u8fdc\u8fd4\u56de\u4f4d\u7f6e\u5bf9\u8c61\u5143\u7d20 | \u4ece\u8fdc\u5230\u8fd1\u8fd4\u56de\u4f4d\u7f6e\u5bf9\u8c61\u5143\u7d20\u3002<\/p>\n<\/li>\n<li>\n<p>COUNT count\uff1a\u9009\u53d6\u524d N \u4e2a\u5339\u914d\u4f4d\u7f6e\u5bf9\u8c61\u5143\u7d20\u3002(\u4e0d\u8bbe\u7f6e\u5219\u8fd4\u56de\u6240\u6709\u5143\u7d20)<\/p>\n<\/li>\n<li>\n<p>STORE key\uff1a\u5c06\u8fd4\u56de\u7ed3\u679c\u7684\u5730\u7406\u4f4d\u7f6e\u4fe1\u606f\u4fdd\u5b58\u5230\u6307\u5b9a key\u3002<\/p>\n<\/li>\n<li>\n<p>STORedisT key\uff1a\u5c06\u8fd4\u56de\u7ed3\u679c\u79bb\u4e2d\u5fc3\u70b9\u7684\u8ddd\u79bb\u4fdd\u5b58\u5230\u6307\u5b9a Key\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u7531\u4e8e STORE \u548c STORedisT \u4e24\u4e2a\u9009\u9879\u7684\u5b58\u5728\uff0cGEORADIUS \u548c GEORADIUSBYMEMBER &nbsp;\u547d\u4ee4\u5728\u6280\u672f\u4e0a\u4f1a\u88ab\u6807\u8bb0\u4e3a\u5199\u5165\u547d\u4ee4\uff0c\u4ece\u800c\u53ea\u4f1a\u67e5\u8be2(\u5199\u5165)\u4e3b\u5b9e\u4f8b\uff0cQPS \u8fc7\u9ad8\u65f6\u5bb9\u6613\u9020\u6210\u4e3b\u5b9e\u4f8b\u8bfb\u5199\u538b\u529b\u8fc7\u5927\u3002<\/p>\n<p>\u4e3a\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u5728 Redis 3.2.10 \u548c Redis 4.0.0 \u4e2d\uff0c\u5206\u522b\u65b0\u589e\u4e86 GEORADIUS_RO \u548c &nbsp;GEORADIUSBYMEMBER_RO \u4e24\u4e2a\u53ea\u8bfb\u547d\u4ee4\u3002<\/p>\n<p>\u4e0d\u8fc7\uff0c\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\u7b14\u8005\u53d1\u73b0 \u5728 java package Redis.clients.jedis.params.geo \u7684 GeoRadiusParam &nbsp;\u53c2\u6570\u7c7b\u4e2d\u5e76\u4e0d\u5305\u542b STORE \u548c STORedisT \u4e24\u4e2a\u53c2\u6570\u9009\u9879\u3002<\/p>\n<p>\u5728\u8c03\u7528 GEORADIUS \u65f6\u662f\u5426\u771f\u7684\u53ea\u67e5\u8be2\u4e86\u4e3b\u5b9e\u4f8b\uff0c\u8fd8\u662f\u8fdb\u884c\u4e86\u53ea\u8bfb\u5c01\u88c5\u3002\u611f\u5174\u8da3\u7684\u670b\u53cb\u53ef\u4ee5\u81ea\u5df1\u7814\u7a76\u4e0b\u3002<\/p>\n<p>\u6210\u529f\u67e5\u8be2\u540e\u7684\u8fd4\u56de\u503c\uff0c\u4e0d\u5e26 WITH \u9650\u5b9a\uff0c\u8fd4\u56de\u4e00\u4e2a member list\uff0c\u5982\uff1a<\/p>\n<\/p>\n<pre>[\"member1\",\"member2\",\"member3\"]<\/pre>\n<\/p>\n<p>\u5e26 WITH \u9650\u5b9a\uff0cMember List \u4e2d\u6bcf\u4e2a Member \u4e5f\u662f\u4e00\u4e2a\u5d4c\u5957 List\uff0c\u5982\uff1a<\/p>\n<\/p>\n<pre>[&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;[\"member1\",&nbsp;distance1,&nbsp;[longitude1,&nbsp;latitude1]]&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;[\"member2\",&nbsp;distance2,&nbsp;[longitude2,&nbsp;latitude2]]&nbsp;\r\n]<\/pre>\n<\/p>\n<p><strong><span style=\"font-size: large\">\u6e90\u7801\u5206\u6790<\/span><\/strong><\/p>\n<p>PS\uff1a\u6b64\u6bb5\u6e90\u7801\u8f83\u957f\uff0c\u770b\u4e0d\u4e0b\u53bb\u7684\u53ef\u76f4\u63a5\u770b\u4e2d\u6587\u6ce8\u91ca\uff0c\u6216\u76f4\u63a5\u8df3\u5230\u5c0f\u7ed3\u90e8\u5206\u3002<\/p>\n<\/p>\n<pre>\/*&nbsp;GEORADIUS&nbsp;key&nbsp;x&nbsp;y&nbsp;radius&nbsp;unit&nbsp;[WITHDIST]&nbsp;[WITHHASH]&nbsp;[WITHCOORD]&nbsp;[ASC|DESC]&nbsp;\r\n&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[COUNT&nbsp;count]&nbsp;[STORE&nbsp;key]&nbsp;[STORedisT&nbsp;key]&nbsp;\r\n&nbsp;*&nbsp;GEORADIUSBYMEMBER&nbsp;key&nbsp;member&nbsp;radius&nbsp;unit&nbsp;...&nbsp;options&nbsp;...&nbsp;*\/&nbsp;\r\nvoid&nbsp;georadiusGeneric(client&nbsp;*c,&nbsp;int&nbsp;flags)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;robj&nbsp;*key&nbsp;=&nbsp;c-&gt;argv[1];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;robj&nbsp;*storekey&nbsp;=&nbsp;NULL;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;stoRedist&nbsp;=&nbsp;0;&nbsp;\/*&nbsp;0&nbsp;for&nbsp;STORE,&nbsp;1&nbsp;for&nbsp;STORedisT.&nbsp;*\/&nbsp;\r\n\/\/\u6839\u636ekey\u83b7\u53d6\u6709\u5e8f\u96c6\u5408&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;robj&nbsp;*zobj&nbsp;=&nbsp;NULL;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((zobj&nbsp;=&nbsp;lookupKeyReadOrReply(c,&nbsp;key,&nbsp;shared.null[c-&gt;resp]))&nbsp;==&nbsp;NULL&nbsp;||&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkType(c,&nbsp;zobj,&nbsp;OBJ_ZSET))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;\r\n\/\/\u6839\u636e\u7528\u6237\u8f93\u5165\uff08\u7ecf\u7eac\u5ea6\/member\uff09\u786e\u8ba4\u4e2d\u5fc3\u70b9\u7ecf\u7eac\u5ea6&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;base_args;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;xy[2]&nbsp;=&nbsp;{&nbsp;0&nbsp;};&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flags&nbsp;&amp;&nbsp;RADIUS_COORDS)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2026\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;radius_meters&nbsp;=&nbsp;0,&nbsp;conversion&nbsp;=&nbsp;1;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((radius_meters&nbsp;=&nbsp;extractDistanceOrReply(c,&nbsp;c-&gt;argv&nbsp;+&nbsp;base_args&nbsp;-&nbsp;2,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;conversion))&nbsp;argc&nbsp;&gt;&nbsp;base_args)&nbsp;{&nbsp;\r\n\/\/\u83b7\u53d6&nbsp;STORE&nbsp;\u548c&nbsp;STORedisT&nbsp;\u53c2\u6570&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(storekey&nbsp;&amp;&amp;&nbsp;(withdist&nbsp;||&nbsp;withhash&nbsp;||&nbsp;withcoords))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addReplyError(c,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"STORE&nbsp;option&nbsp;in&nbsp;GEORADIUS&nbsp;is&nbsp;not&nbsp;compatible&nbsp;with&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"WITHDIST,&nbsp;WITHHASH&nbsp;and&nbsp;WITHCOORDS&nbsp;options\");&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(count&nbsp;!=&nbsp;0&nbsp;&amp;&amp;&nbsp;sort&nbsp;==&nbsp;SORT_NONE)&nbsp;sort&nbsp;=&nbsp;SORT_ASC;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;GeoHashRadius&nbsp;georadius&nbsp;=&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;geohashGetAreasByRadiusWGS84(xy[0],&nbsp;xy[1],&nbsp;radius_meters);&nbsp;\r\n\/\/\u5bf9\u4e2d\u5fc3\u70b9\u53ca\u5176\u5468\u56f48\u4e2ageohash\u7f51\u683c\u533a\u57df\u8fdb\u884c\u67e5\u627e\uff0c\u627e\u51fa\u8303\u56f4\u5185\u5143\u7d20\u5bf9\u8c61&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;geoArray&nbsp;*ga&nbsp;=&nbsp;geoArrayCreate();&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;membersOfAllNeighbors(zobj,&nbsp;georadius,&nbsp;xy[0],&nbsp;xy[1],&nbsp;radius_meters,&nbsp;ga);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;no&nbsp;matching&nbsp;results,&nbsp;the&nbsp;user&nbsp;gets&nbsp;an&nbsp;empty&nbsp;reply.&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ga-&gt;used&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;storekey&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addReplyNull(c);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;geoArrayFree(ga);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;geoArrayFree(ga);<\/pre>\n<\/p>\n<p>\u4e0a\u6587\u4ee3\u7801\u4e2d\u6700\u6838\u5fc3\u7684\u6b65\u9aa4\u6709\u4e24\u4e2a\uff0c\u4e00\u662f\u201c\u8ba1\u7b97\u4e2d\u5fc3\u70b9\u8303\u56f4\u201d\uff0c\u4e8c\u662f\u201c\u5bf9\u4e2d\u5fc3\u70b9\u53ca\u5176\u5468\u56f4 8 \u4e2a GEOHASH \u7f51\u683c\u533a\u57df\u8fdb\u884c\u67e5\u627e\u201d\u3002<\/p>\n<p>\u5bf9\u5e94\u7684\u662f\u5982\u4e0b\u4e24\u4e2a\u51fd\u6570\uff1a<\/p>\n<ul>\n<li>\n<p><strong>geohashGetAreasByRadiusWGS84<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>membersOfAllNeighbors<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u6211\u4eec\u4f9d\u6b21\u6765\u770b\uff1a<\/p>\n<p><strong>\u2460\u8ba1\u7b97\u4e2d\u5fc3\u70b9\u8303\u56f4<\/strong><\/p>\n<p><strong>\/\/ geohash_helper.c<\/strong><\/p>\n<\/p>\n<pre>\/*&nbsp;GEORADIUS&nbsp;key&nbsp;x&nbsp;y&nbsp;radius&nbsp;unit&nbsp;[WITHDIST]&nbsp;[WITHHASH]&nbsp;[WITHCOORD]&nbsp;[ASC|DESC]&nbsp;\r\n&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[COUNT&nbsp;count]&nbsp;[STORE&nbsp;key]&nbsp;[STORedisT&nbsp;key]&nbsp;\r\n&nbsp;*&nbsp;GEORADIUSBYMEMBER&nbsp;key&nbsp;member&nbsp;radius&nbsp;unit&nbsp;...&nbsp;options&nbsp;...&nbsp;*\/&nbsp;\r\nvoid&nbsp;georadiusGeneric(client&nbsp;*c,&nbsp;int&nbsp;flags)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;robj&nbsp;*key&nbsp;=&nbsp;c-&gt;argv[1];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;robj&nbsp;*storekey&nbsp;=&nbsp;NULL;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;stoRedist&nbsp;=&nbsp;0;&nbsp;\/*&nbsp;0&nbsp;for&nbsp;STORE,&nbsp;1&nbsp;for&nbsp;STORedisT.&nbsp;*\/&nbsp;\r\n\/\/\u6839\u636ekey\u83b7\u53d6\u6709\u5e8f\u96c6\u5408&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;robj&nbsp;*zobj&nbsp;=&nbsp;NULL;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((zobj&nbsp;=&nbsp;lookupKeyReadOrReply(c,&nbsp;key,&nbsp;shared.null[c-&gt;resp]))&nbsp;==&nbsp;NULL&nbsp;||&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkType(c,&nbsp;zobj,&nbsp;OBJ_ZSET))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;\r\n\/\/\u6839\u636e\u7528\u6237\u8f93\u5165\uff08\u7ecf\u7eac\u5ea6\/member\uff09\u786e\u8ba4\u4e2d\u5fc3\u70b9\u7ecf\u7eac\u5ea6&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;base_args;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;xy[2]&nbsp;=&nbsp;{&nbsp;0&nbsp;};&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(flags&nbsp;&amp;&nbsp;RADIUS_COORDS)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2026\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;radius_meters&nbsp;=&nbsp;0,&nbsp;conversion&nbsp;=&nbsp;1;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((radius_meters&nbsp;=&nbsp;extractDistanceOrReply(c,&nbsp;c-&gt;argv&nbsp;+&nbsp;base_args&nbsp;-&nbsp;2,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;conversion))&nbsp;argc&nbsp;&gt;&nbsp;base_args)&nbsp;{&nbsp;\r\n\/\/\u83b7\u53d6&nbsp;STORE&nbsp;\u548c&nbsp;STORedisT&nbsp;\u53c2\u6570&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(storekey&nbsp;&amp;&amp;&nbsp;(withdist&nbsp;||&nbsp;withhash&nbsp;||&nbsp;withcoords))&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addReplyError(c,&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"STORE&nbsp;option&nbsp;in&nbsp;GEORADIUS&nbsp;is&nbsp;not&nbsp;compatible&nbsp;with&nbsp;\"&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"WITHDIST,&nbsp;WITHHASH&nbsp;and&nbsp;WITHCOORDS&nbsp;options\");&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(count&nbsp;!=&nbsp;0&nbsp;&amp;&amp;&nbsp;sort&nbsp;==&nbsp;SORT_NONE)&nbsp;sort&nbsp;=&nbsp;SORT_ASC;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;GeoHashRadius&nbsp;georadius&nbsp;=&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;geohashGetAreasByRadiusWGS84(xy[0],&nbsp;xy[1],&nbsp;radius_meters);&nbsp;\r\n\/\/\u5bf9\u4e2d\u5fc3\u70b9\u53ca\u5176\u5468\u56f48\u4e2ageohash\u7f51\u683c\u533a\u57df\u8fdb\u884c\u67e5\u627e\uff0c\u627e\u51fa\u8303\u56f4\u5185\u5143\u7d20\u5bf9\u8c61&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;geoArray&nbsp;*ga&nbsp;=&nbsp;geoArrayCreate();&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;membersOfAllNeighbors(zobj,&nbsp;georadius,&nbsp;xy[0],&nbsp;xy[1],&nbsp;radius_meters,&nbsp;ga);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;If&nbsp;no&nbsp;matching&nbsp;results,&nbsp;the&nbsp;user&nbsp;gets&nbsp;an&nbsp;empty&nbsp;reply.&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ga-&gt;used&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;storekey&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addReplyNull(c);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;geoArrayFree(ga);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;geoArrayFree(ga);<\/pre>\n<\/p>\n<p><strong>\u2461\u5bf9\u4e2d\u5fc3\u70b9\u53ca\u5176\u5468\u56f4 8 \u4e2a GEOHASH \u7f51\u683c\u533a\u57df\u8fdb\u884c\u67e5\u627e<\/strong><\/p>\n<p><strong>\/\/ geo.c<\/strong><\/p>\n<\/p>\n<pre>\/\/\u57289\u4e2ahashBox\u4e2d\u83b7\u53d6\u60f3\u8981\u7684\u5143\u7d20&nbsp;\r\nint&nbsp;membersOfAllNeighbors(robj&nbsp;*zobj,&nbsp;GeoHashRadius&nbsp;n,&nbsp;double&nbsp;lon,&nbsp;double&nbsp;lat,&nbsp;double&nbsp;radius,&nbsp;geoArray&nbsp;*ga)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;GeoHashBits&nbsp;neighbors[9];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i,&nbsp;count&nbsp;=&nbsp;0,&nbsp;last_processed&nbsp;=&nbsp;0;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;debugmsg&nbsp;=&nbsp;0;&nbsp;\r\n\/\/\u83b7\u53d69\u4e2a\u641c\u7d22hashBox&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;neighbors[0]&nbsp;=&nbsp;n.hash;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\u2026\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;neighbors[8]&nbsp;=&nbsp;n.neighbors.south_west;&nbsp;\r\n\/\/\u5728\u6bcf\u4e2ahashBox\u4e2d\u641c\u7d22\u76ee\u6807\u70b9&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;5000KM\u65f6\u53ef\u80fd\u51fa\u73b0)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(last_processed&nbsp;&amp;&amp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;neighbors[i].bits&nbsp;==&nbsp;neighbors[last_processed].bits&nbsp;&amp;&amp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;neighbors[i].step&nbsp;==&nbsp;neighbors[last_processed].step)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u641c\u7d22hashBox\u4e2d\u6ee1\u8db3\u6761\u4ef6\u7684\u5bf9\u8c61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=&nbsp;membersOfGeoHashBox(zobj,&nbsp;neighbors[i],&nbsp;ga,&nbsp;lon,&nbsp;lat,&nbsp;radius);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_processed&nbsp;=&nbsp;i;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;count;&nbsp;\r\nint&nbsp;membersOfGeoHashBox(robj&nbsp;*zobj,&nbsp;GeoHashBits&nbsp;hash,&nbsp;geoArray&nbsp;*ga,&nbsp;double&nbsp;lon,&nbsp;double&nbsp;lat,&nbsp;double&nbsp;radius)&nbsp;{&nbsp;\r\n\/\/\u83b7\u53d6hashBox\u5185\u7684\u6700\u5927\u3001\u6700\u5c0fgeohash\u503c\uff0852\u4f4d\uff09&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;GeoHashFix52Bits&nbsp;min,&nbsp;max;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;scoresOfGeoHashBox(hash,&amp;min,&amp;max);&nbsp;\r\n\/\/\u6839\u636e\u6700\u5927\u3001\u6700\u5c0fgeohash\u503c\u7b5b\u9009zobj\u96c6\u5408\u4e2d\u6ee1\u8db3\u6761\u4ef6\u7684\u70b9&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;geoGetPointsInRange(zobj,&nbsp;min,&nbsp;max,&nbsp;lon,&nbsp;lat,&nbsp;radius,&nbsp;ga);&nbsp;\r\nint&nbsp;geoGetPointsInRange(robj&nbsp;*zobj,&nbsp;double&nbsp;min,&nbsp;double&nbsp;max,&nbsp;double&nbsp;lon,&nbsp;double&nbsp;lat,&nbsp;double&nbsp;radius,&nbsp;geoArray&nbsp;*ga)&nbsp;{&nbsp;\r\n\/\/\u641c\u7d22Range\u7684\u53c2\u6570\u8fb9\u754c\u8bbe\u7f6e\uff08\u53739\u4e2ahashBox\u5176\u4e2d\u4e00\u4e2a\u7684\u8fb9\u754c\u8303\u56f4\uff09&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;zrangespec&nbsp;range&nbsp;=&nbsp;{&nbsp;.min&nbsp;=&nbsp;min,&nbsp;.max&nbsp;=&nbsp;max,&nbsp;.minex&nbsp;=&nbsp;0,&nbsp;.maxex&nbsp;=&nbsp;1&nbsp;};&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;origincount&nbsp;=&nbsp;ga-&gt;used;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;sds&nbsp;member;&nbsp;\r\n\/\/\u641c\u7d22\u96c6\u5408zobj\u53ef\u80fd\u6709ZIPLIST\u548cSKIPLIST\u4e24\u79cd\u7f16\u7801\u65b9\u5f0f\uff0c\u8fd9\u91cc\u4ee5SKIPLIST\u4e3a\u4f8b\uff0c\u903b\u8f91\u662f\u4e00\u6837\u7684&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(zobj-&gt;encoding&nbsp;==&nbsp;OBJ_ENCODING_ZIPLIST)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u2026\u2026&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(zobj-&gt;encoding&nbsp;==&nbsp;OBJ_ENCODING_SKIPLIST)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zset&nbsp;*zs&nbsp;=&nbsp;zobj-&gt;ptr;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zskiplist&nbsp;*zsl&nbsp;=&nbsp;zs-&gt;zsl;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zskiplistNode&nbsp;*ln;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u83b7\u53d6\u5728hashBox\u8303\u56f4\u5185\u7684\u9996\u4e2a\u5143\u7d20\uff08\u8df3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u6548\u7387\u53ef\u6bd4\u62df\u4e8e\u4e8c\u53c9\u67e5\u627e\u6811\uff09\uff0c\u6ca1\u6709\u5219\u8fd40&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ln&nbsp;=&nbsp;zslFirstInRange(zsl,&nbsp;&amp;range))&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Nothing&nbsp;exists&nbsp;starting&nbsp;at&nbsp;our&nbsp;min.&nbsp;&nbsp;No&nbsp;results.&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(ln)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sds&nbsp;ele&nbsp;=&nbsp;ln-&gt;ele;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u904d\u5386\u5143\u7d20\u8d85\u51farange\u8303\u56f4\u5219break&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;Abort&nbsp;when&nbsp;the&nbsp;node&nbsp;is&nbsp;no&nbsp;longer&nbsp;in&nbsp;range.&nbsp;*\/&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!zslValueLteMax(ln-&gt;score,&nbsp;&amp;range))&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ele&nbsp;=&nbsp;sdsdup(ele);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(geoAppendIfWithinRadius(ga,lon,lat,radius,ln-&gt;score,ele)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==&nbsp;C_ERR)&nbsp;sdsfree(ele);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ln&nbsp;=&nbsp;ln-&gt;level[0].forward;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ga-&gt;used&nbsp;-&nbsp;origincount;&nbsp;\r\nint&nbsp;geoAppendIfWithinRadius(geoArray&nbsp;*ga,&nbsp;double&nbsp;lon,&nbsp;double&nbsp;lat,&nbsp;double&nbsp;radius,&nbsp;double&nbsp;score,&nbsp;sds&nbsp;member)&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;distance,&nbsp;xy[2];&nbsp;\r\n\/\/\u89e3\u7801\u9519\u8bef,&nbsp;\u8fd4\u56deerror&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!decodeGeohash(score,xy))&nbsp;return&nbsp;C_ERR;&nbsp;\/*&nbsp;Can't&nbsp;decode.&nbsp;*\/&nbsp;\r\n\/\/\u6700\u7ec8\u8ddd\u79bb\u6821\u9a8c(\u8ba1\u7b97\u7403\u9762\u8ddd\u79bbdistance\u770b\u662f\u5426\u5c0f\u4e8eradius)&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!geohashGetDistanceIfInRadiusWGS84(lon,lat,&nbsp;xy[0],&nbsp;xy[1],&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;radius,&nbsp;&amp;distance))&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;C_ERR;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;geoPoint&nbsp;*gp&nbsp;=&nbsp;geoArrayAppend(ga);&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;gp-&gt;longitude&nbsp;=&nbsp;xy[0];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;gp-&gt;latitude&nbsp;=&nbsp;xy[1];&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;gp-&gt;dist&nbsp;=&nbsp;distance;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;gp-&gt;member&nbsp;=&nbsp;member;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;gp-&gt;score&nbsp;=&nbsp;score;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;C_OK;<\/pre>\n<\/p>\n<p><strong><span style=\"font-size: large\">\u7b97\u6cd5\u5c0f\u7ed3<\/span><\/strong><\/p>\n<p>\u629b\u5f00\u4f17\u591a\u53ef\u9009\u53c2\u6570\u4e0d\u8c08\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b GEORADIUS \u547d\u4ee4\u662f\u600e\u4e48\u5229\u7528 GEOHASH \u83b7\u53d6\u76ee\u6807\u4f4d\u7f6e\u5bf9\u8c61\u7684\uff1a<\/p>\n<ul>\n<li>\n<p>\u53c2\u6570\u63d0\u53d6\u548c\u6821\u9a8c\u3002<\/p>\n<\/li>\n<li>\n<p>\u5229\u7528\u4e2d\u5fc3\u70b9\u548c\u8f93\u5165\u534a\u5f84\u8ba1\u7b97\u5f85\u67e5\u533a\u57df\u8303\u56f4\u3002\u8fd9\u4e2a\u8303\u56f4\u53c2\u6570\u5305\u62ec\u6ee1\u8db3\u6761\u4ef6\u7684\u6700\u9ad8\u7684 GEOHASH &nbsp;\u7f51\u683c\u7b49\u7ea7(\u7cbe\u5ea6)\u4ee5\u53ca\u5bf9\u5e94\u7684\u80fd\u591f\u8986\u76d6\u76ee\u6807\u533a\u57df\u7684\u4e5d\u5bab\u683c\u4f4d\u7f6e(\u540e\u7eed\u4f1a\u6709\u8be6\u7ec6\u8bf4\u660e)\u3002<\/p>\n<\/li>\n<li>\n<p>\u5bf9\u4e5d\u5bab\u683c\u8fdb\u884c\u904d\u5386\uff0c\u6839\u636e\u6bcf\u4e2a GEOHASH \u7f51\u683c\u7684\u8303\u56f4\u6846\u9009\u51fa\u4f4d\u7f6e\u5bf9\u8c61\u3002\u8fdb\u4e00\u6b65\u627e\u51fa\u4e0e\u4e2d\u5fc3\u70b9\u8ddd\u79bb\u5c0f\u4e8e\u8f93\u5165\u534a\u5f84\u7684\u5bf9\u8c61\uff0c\u8fdb\u884c\u8fd4\u56de\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u76f4\u63a5\u63cf\u8ff0\u4e0d\u592a\u597d\u7406\u89e3\uff0c\u6211\u4eec\u901a\u8fc7\u5982\u4e0b\u4e24\u5f20\u56fe\u518d\u5bf9\u7b97\u6cd5\u8fdb\u884c\u7b80\u5355\u7684\u6f14\u793a\uff1a<\/p>\n<\/p>\n<p>&nbsp;<\/p>\n<\/p>\n<p>\u4ee4\u5de6\u56fe\u7684\u4e2d\u5fc3\u4e3a\u641c\u7d22\u4e2d\u5fc3\uff0c\u7eff\u8272\u5706\u5f62\u533a\u57df\u4e3a\u76ee\u6807\u533a\u57df\uff0c\u6240\u6709\u70b9\u4e3a\u5f85\u641c\u7d22\u7684\u4f4d\u7f6e\u5bf9\u8c61\uff0c\u7ea2\u8272\u70b9\u5219\u4e3a\u6ee1\u8db3\u6761\u4ef6\u7684\u4f4d\u7f6e\u5bf9\u8c61\u3002<\/p>\n<p>\u5728\u5b9e\u9645\u641c\u7d22\u65f6,\u9996\u5148\u4f1a\u6839\u636e\u641c\u7d22\u534a\u5f84\u8ba1\u7b97 GEOHASH \u7f51\u683c\u7b49\u7ea7(\u5373\u53f3\u56fe\u4e2d\u7f51\u683c\u5927\u5c0f\u7b49\u7ea7)\uff0c\u5e76\u786e\u5b9a\u4e5d\u5bab\u683c\u4f4d\u7f6e(\u5373\u7ea2\u8272\u4e5d\u5bab\u683c\u4f4d\u7f6e\u4fe1\u606f)\u3002<\/p>\n<p>\u518d\u4f9d\u6b21\u67e5\u627e\u8ba1\u7b97\u4e5d\u5bab\u683c\u4e2d\u7684\u70b9(\u84dd\u70b9\u548c\u7ea2\u70b9)\u4e0e\u4e2d\u5fc3\u70b9\u7684\u8ddd\u79bb\uff0c\u6700\u7ec8\u7b5b\u9009\u51fa\u8ddd\u79bb\u8303\u56f4\u5185\u7684\u70b9(\u7ea2\u70b9)\u3002<\/p>\n<p><strong><span style=\"font-size: large\">\u7b97\u6cd5\u5206\u6790<\/span><\/strong><\/p>\n<p>\u4e3a\u4ec0\u4e48\u8981\u7528\u8fd9\u79cd\u7b97\u6cd5\u7b56\u7565\u8fdb\u884c\u67e5\u8be2\uff0c\u6216\u8005\u8bf4\u8fd9\u79cd\u7b56\u7565\u7684\u4f18\u52bf\u5728\u54ea\uff0c\u8ba9\u6211\u4eec\u4ee5\u95ee\u7b54\u7684\u65b9\u5f0f\u8fdb\u884c\u5206\u6790\u8bf4\u660e\u3002<\/p>\n<p>\u2460\u4e3a\u4ec0\u4e48\u8981\u627e\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u6700\u9ad8\u7684 GEOHASH \u7f51\u683c\u7b49\u7ea7?\u4e3a\u4ec0\u4e48\u7528\u4e5d\u5bab\u683c?<\/p>\n<p>\u8fd9\u5176\u5b9e\u662f\u4e00\u4e2a\u95ee\u9898\uff0c\u672c\u8d28\u4e0a\u662f\u5bf9\u6240\u6709\u7684\u5143\u7d20\u5bf9\u8c61\u8fdb\u884c\u4e86\u4e00\u6b21\u521d\u6b65\u7b5b\u9009\u3002\u5728\u591a\u5c42 GEOHASH \u7f51\u683c\u4e2d\uff0c\u6bcf\u4e2a\u4f4e\u7b49\u7ea7\u7684 GEOHASH \u7f51\u683c\u90fd\u662f\u7531 4 &nbsp;\u4e2a\u9ad8\u4e00\u7ea7\u7684\u7f51\u683c\u62fc\u63a5\u800c\u6210(\u5982\u56fe)\u3002<\/p>\n<\/p>\n<p>&nbsp;<\/p>\n<\/p>\n<p>\u6362\u53e5\u8bdd\u8bf4\uff0cGEOHASH &nbsp;\u7f51\u683c\u7b49\u7ea7\u8d8a\u9ad8\uff0c\u6240\u8986\u76d6\u7684\u5730\u7406\u4f4d\u7f6e\u8303\u56f4\u5c31\u8d8a\u5c0f\u3002\u5f53\u6211\u4eec\u6839\u636e\u8f93\u5165\u534a\u5f84\u548c\u4e2d\u5fc3\u70b9\u4f4d\u7f6e\u8ba1\u7b97\u51fa\u7684\u80fd\u591f\u8986\u76d6\u76ee\u6807\u533a\u57df\u7684\u6700\u9ad8\u7b49\u7ea7\u7684\u4e5d\u5bab\u683c(\u7f51\u683c)\u65f6\uff0c\u5c31\u5df2\u7ecf\u5bf9\u4e5d\u5bab\u683c\u5916\u7684\u5143\u7d20\u8fdb\u884c\u4e86\u7b5b\u9664\u3002<\/p>\n<p>\u8fd9\u91cc\u4e4b\u6240\u4ee5\u4f7f\u7528\u4e5d\u5bab\u683c\uff0c\u800c\u4e0d\u7528\u5355\u4e2a\u7f51\u683c\uff0c\u4e3b\u8981\u539f\u56e0\u8fd8\u662f\u4e3a\u4e86\u907f\u514d\u8fb9\u754c\u60c5\u51b5\uff0c\u5c3d\u53ef\u80fd\u7f29\u5c0f\u67e5\u8be2\u533a\u57df\u8303\u56f4\u3002<\/p>\n<p>\u8bd5\u60f3\u4ee5 0 \u7ecf\u7eac\u5ea6\u4e3a\u4e2d\u5fc3\uff0c\u5c31\u7b97\u67e5 1 \u7c73\u8303\u56f4\uff0c\u5355\u4e2a\u7f51\u683c\u8986\u76d6\u7684\u8bdd\u4e5f\u5f97\u67e5\u6574\u4e2a\u5730\u7403\u533a\u57df\u3002\u800c\u5411\u56db\u5468\u516b\u4e2a\u65b9\u5411\u6269\u5c55\u4e00\u5708\u53ef\u6709\u6548\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<p><strong>\u2461\u5982\u4f55\u901a\u8fc7 GEOHASH \u7f51\u683c\u7684\u8303\u56f4\u6846\u9009\u51fa\u5143\u7d20\u5bf9\u8c61?\u6548\u7387\u5982\u4f55?<\/strong><\/p>\n<p>\u9996\u5148\u5728\u6bcf\u4e2a GEOHASH \u7f51\u683c\u4e2d\u7684 GEOHASH \u503c\u90fd\u662f\u8fde\u7eed\u7684\uff0c\u6709\u56fa\u5b9a\u8303\u56f4\u3002\u6240\u4ee5\u53ea\u8981\u627e\u51fa\u6709\u5e8f\u96c6\u5408\u4e2d\uff0c\u5904\u5728\u8be5\u8303\u56f4\u7684\u4f4d\u7f6e\u5bf9\u8c61\u5373\u53ef\u3002<\/p>\n<p>\u4ee5\u4e0b\u662f\u6709\u5e8f\u96c6\u5408\u7684\u8df3\u8868\u6570\u636e\u7ed3\u6784\uff1a<\/p>\n<\/p>\n<p>&nbsp;<\/p>\n<\/p>\n<p>\u5176\u62e5\u6709\u7c7b\u4f3c\u4e8c\u53c9\u67e5\u627e\u6811\u7684\u67e5\u8be2\u6548\u7387\uff0c\u64cd\u4f5c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u6027\u4e3a O(log(N))\u3002\u4e14\u6700\u5e95\u5c42\u7684\u6240\u6709\u5143\u7d20\u90fd\u4ee5\u94fe\u8868\u7684\u5f62\u5f0f\u6309\u5e8f\u6392\u5217\u3002<\/p>\n<p>\u6240\u4ee5\u5728\u67e5\u8be2\u65f6\uff0c\u53ea\u8981\u627e\u5230\u96c6\u5408\u4e2d\u5904\u5728\u76ee\u6807 GEOHASH \u7f51\u683c\u4e2d\u7684\u7b2c\u4e00\u4e2a\u503c\uff0c\u540e\u7eed\u4f9d\u6b21\u5bf9\u6bd4\u5373\u53ef\uff0c\u4e0d\u7528\u591a\u6b21\u67e5\u627e\u3002<\/p>\n<p>\u4e5d\u5bab\u683c\u4e0d\u80fd\u4e00\u8d77\u67e5\uff0c\u8981\u4e00\u4e2a\u4e2a\u904d\u5386\u7684\u539f\u56e0\u4e5f\u5728\u4e8e\u4e5d\u5bab\u683c\u5404\u7f51\u683c\u5bf9\u5e94\u7684 GEOHASH \u503c\u4e0d\u5177\u6709\u8fde\u7eed\u6027\u3002\u53ea\u6709\u8fde\u7eed\u4e86\uff0c\u67e5\u8be2\u6548\u7387\u624d\u4f1a\u9ad8\uff0c\u4e0d\u7136\u8981\u591a\u505a\u8bb8\u591a\u8ddd\u79bb\u8fd0\u7b97\u3002<\/p>\n<p>\u7efc\u4e0a\uff0c\u6211\u4eec\u4ece\u6e90\u7801\u89d2\u5ea6\u89e3\u6790\u4e86 Redis Geo \u6a21\u5757\u4e2d \u201c\u589e(GEOADD)\u201d \u548c \u201c\u67e5(GEORADIUS)\u201d \u7684\u8be6\u7ec6\u8fc7\u7a0b\u3002<\/p>\n<p>\u5e76\u53ef\u63a8\u7b97\u51fa Redis \u4e2d GEORADIUS \u67e5\u627e\u9644\u8fd1\u7684\u4eba\u529f\u80fd\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1aO(N+log(M))\u3002<\/p>\n<p>\u5176\u4e2d N \u4e3a\u6307\u5b9a\u534a\u5f84\u8303\u56f4\u5185\u7684\u4f4d\u7f6e\u5143\u7d20\u6570\u91cf\uff0c\u800c M \u5219\u662f\u88ab\u4e5d\u5bab\u683c\u5708\u4f4f\u8ba1\u7b97\u8ddd\u79bb\u7684\u5143\u7d20\u7684\u6570\u91cf\u3002<\/p>\n<p>\u7ed3\u5408 Redis \u672c\u8eab\u57fa\u4e8e\u5185\u5b58\u7684\u5b58\u50a8\u7279\u6027\uff0c\u5728\u5b9e\u9645\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u6709\u975e\u5e38\u9ad8\u7684\u8fd0\u884c\u6548\u7387\u3002<\/p>\n<p>\u4f5c\u8005\uff1a\u4e07\u6c68<\/p>\n<p>\u7b80\u4ecb\uff1a\u997f\u4e86\u4e48\u8d44\u6df1\u5f00\u53d1\u5de5\u7a0b\u5e08\u3002iOS\uff0cGo\uff0cJava \u5747\u6709\u6d89\u730e\u3002\u76ee\u524d\u4e3b\u653b\u5927\u6570\u636e\u5f00\u53d1\u3002\u559c\u6b22\u9a91\u884c\u3001\u722c\u5c71\u3002<\/p>\n<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u641e\u5b9a\uff01Redis\u5b9e\u73b0\u201c\u9644\u8fd1\u7684\u4eba\u201d&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-201484","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=201484"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201484\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}