>데이터 베이스 >Redis >Redis를 사용하여 WeChat 흔들기 기능 완성

Redis를 사용하여 WeChat 흔들기 기능 완성

齐天大圣
齐天大圣원래의
2020-05-20 15:40:202114검색

Redis는 주변 사람, 흔들기 등의 기능을 완성할 수 있는 지리적 위치 정보(GEO) 기능을 제공합니다. 먼저 GEO 관련 API를 소개하겠습니다.

GEO API

주소 위치 정보 추가

geoadd 키 경도 위도 멤버 [경도 멤버 ...]

  • 경도 : 경도

  • 위도: 위도

  • member: member

이 명령은 한 번에 한 명 이상의 구성원을 추가할 수 있습니다.

모두 Hefei에 거주하는 일부 사용자는 이제 Redis에 지리적 좌표를 저장합니다.

  • 리틀A는 집에서 TV를 보고 있습니다. 집의 좌표는 117.230279, 31.81676

  • 리틀B는 회사에서 야근을 하고 있습니다. 회사의 좌표는 117.229704, 31.824676

  • 입니다.
  • 조금 C는 출장 중입니다. 주소 좌표는 117.300419, 31.696095

  • 리틀 D가 집에서 아기를 돌보고 있습니다. 117.192909, 31.732465

  • Little E는 아직 학교에 있습니다. 그의 학교 주소 좌표는 117.189604, 31.838297

127.0.0.1:6379> geoadd location 117.230279 31.81676 a 117.229704 31.824676 b
(integer) 2
127.0.0.1:6379> geoadd location 117.300419 31.696095 c
(integer) 1
127.0.0.1:6379> geoadd location 117.192909 31.732465 d
(integer) 1
127.0.0.1:6379> geoadd location 117.189604 31.838297 e
(integer) 1

두 위치 사이의 거리를 알아보세요

geodist key member1 member2 [unit]

unit에는 4개의 유닛이 있습니다

  • 'm' => 미터

  • 'km' => 킬로미터

  • 'mi' => 마일

  • 'ft' => 피트

주로 미터와 킬로미터를 사용합니다. .

이제 작은 A와 작은 B 사이의 거리를 살펴보겠습니다

127.0.0.1:6379> GEODIST location a b km
"0.8821"

작은 A와 작은 B 사이의 거리가 0.88km라는 것을 알 수 있습니다

작은 C와 작은 E 사이의 거리를 살펴보겠습니다

127.0.0.1:6379> GEODIST location c e km
"18.9728"

거의 19km예요.

주소 위치 정보 얻기

geopos 핵심멤버 [멤버...]

샤오디 주소의 경도, 위도 정보를 살펴보자

127.0.0.1:6379> geopos location d
1) 1) "117.19290822744369507"
   2) "31.73246441933707018"

지리정보 위치 알아내기 지정된 위치 범위 설정

georadius 키 경도 위도 반경 m km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key] georadiusbymember 키 멤버 radiusm km|ft| mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

이 두 명령은 다른 명령보다 약간 더 복잡합니다. 이 두 명령을 함께 살펴보겠습니다.

이 두 명령의 기능은 기본적으로 유사합니다. 주요 차이점은 첫 번째 명령은 특정 경도와 위도를 제공하는 반면 두 번째 명령은 구성원 이름만 제공한다는 것입니다. 예를 들어, 허페이에 있는 회원들과 Dashu Mountain 사이의 거리를 알고 싶습니다. Dashu Mountain의 경도와 위도 정보가 Redis에 저장되어 있지 않기 때문에 Dashu Mountain의 경도와 위도를 입력하려면 첫 번째 명령을 사용해야 합니다. 또 다른 예로, 다른 멤버 간의 거리와 Little A의 좌표를 확인하고 싶다면 두 번째 명령을 사용하여 멤버 Little A를 직접 입력하면 됩니다.

radiusm 및 다음 단위는 검색할 반경 거리를 지정하는 필수 정보입니다.

허페이 다슈산 좌표는 117.175571,31.846746

# 查看离大蜀山10km的成员有哪些
127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km
1) "e"
2) "a"
3) "b"

Small e, Small a, Small b가 다슈산과 10km 이내로 상대적으로 가깝다는 것을 알 수 있습니다.

WITHCOORD: 위치 요소의 경도, 위도도 반환합니다

127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km withcoord
1) 1) "e"
   2) 1) "117.18960374593734741"
      2) "31.83829663190295634"
2) 1) "a"
   2) 1) "117.23027676343917847"
      2) "31.81675910621205361"
3) 1) "b"
   2) 1) "117.22970277070999146"
      2) "31.8246750403926697"

회원 외에 해당 회원의 위치 정보 페이지도 제공되는 것을 볼 수 있습니다

withdist: 반환된 결과에는 다음과 같은 거리가 포함됩니다. 중앙 노드 위치

127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km withcoord withdist
1) 1) "e"
   2) "1.6252"
   3) 1) "117.18960374593734741"
      2) "31.83829663190295634"
2) 1) "a"
   2) "6.1522"
   3) 1) "117.23027676343917847"
      2) "31.81675910621205361"
3) 1) "b"
   2) "5.6737"
   3) 1) "117.22970277070999146"
      2) "31.8246750403926697"

를 보면 작은 E는 Dashu산에서 1.62km 떨어져 있고, 작은 A는 Dashu산에서 6.15km 떨어져 있으며, 작은 B는 Dashu산에서 5.67km 떨어져 있음을 알 수 있습니다.

withhash: 이 명령은 무시할 수 있으며 기본적으로 사용되지 않습니다.

COUNT count: 반환되는 결과 수를 지정합니다.

asc|desc: 반환된 결과는 중심 노드로부터의 거리에 따라 오름차순 또는 내림차순으로 표시됩니다.

storedist 키: 중앙 노드에서 지정된 키까지 반환된 결과의 거리를 저장합니다.

# 获取离大蜀山100km内范围的成员,按距离的升序,只需给出最近的4个成员即可
127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 100 km withdist count 4 asc
1) 1) "e"
   2) "1.6252"
2) 1) "b"
   2) "5.6737"
3) 1) "a"
   2) "6.1522"
4) 1) "d"
   2) "12.8164"

실전 전투

위의 지식을 소개한 후, redis와 결합된 PHP를 사용하여 근처에 있는 사람을 찾기 위한 흔들기 기능을 완성할 수 있습니다. 먼저, 회원들의 위치정보를 저장하세요.

伪代码如下:

function addLocation ($key,$member, $lng, $lat)
{
    $redis->geoadd($key, $lng, $lat, $member);
}

然后,获取附近的人的信息

function near (
    $key, 
    $member, 
    $radius, 
    $unit = 'km', 
    $count = 0,  
    $withDist = false, 
    $withcoord = false, 
    $orderby = 'ASC'
)
{
    $redis = new Redis();
    $redis->connect('localhost', 6379);
    $options = [$orderby];
    if ($count > 0) {
        $options['count'] = $count;
    }
    if ($withDist) {
        $options[] = 'WITHDIST';
    }
    if ($withcoord) {
        $options[] = 'WITHCOORD';
    }
    $result = $redis->geoRadiusByMember($key, $member, $radius, $unit, $options);
    return $result;
}

使用redis可以大大方便开发人员,丰富的API可以完成各种各样的需求,Redis的使用已经成为程序员必备的技能了。

위 내용은 Redis를 사용하여 WeChat 흔들기 기능 완성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.