Maison >base de données >Redis >Utilisez Redis pour compléter la fonction de tremblement de WeChat

Utilisez Redis pour compléter la fonction de tremblement de WeChat

齐天大圣
齐天大圣original
2020-05-20 15:40:202121parcourir

Redis fournit une fonction d'informations de localisation géographique (GEO), avec laquelle vous pouvez compléter des fonctions telles que les personnes à proximité et secouer. Tout d’abord, présentons les API pertinentes de GEO.

API GEO

Ajouter des informations de localisation d'adresse

géoajouter une clé longitude latitude membre [longitude latitude membre ...]

  • longitude : longitude

  • latitude : latitude

  • membre : membre

Cette commande peut ajouter un ou plusieurs membres à la fois

Il y a certains utilisateurs, tous à Hefei, ajoutez maintenant Leurs coordonnées géographiques sont stockées dans Redis.

  • Le petit A regarde la télévision à la maison. Les coordonnées de son domicile sont : 117.230279,31.81676

  • Le petit B fait des heures supplémentaires dans l'entreprise. . Les coordonnées de l'entreprise sont : : 117.229704,31.824676

  • Le petit C est en déplacement professionnel, et les coordonnées de l'adresse de son déplacement professionnel sont : 117.300419,31.696095

  • Le petit D s'occupe de son bébé à la maison. Les coordonnées de son domicile sont : 117.192909,31.732465

  • Le petit E est toujours à l'école, et le petit D s'occupe de son bébé à la maison. les coordonnées de l'adresse de son école sont : 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

Obtenir la distance entre deux endroits

clé géodiste membre1 membre2 [unité]

l'unité a quatre unités

  • 'm' => >'km' => Kilomètre

  • 'mi' => Mile

  • 'ft' => Pieds

  • Nous utilisons principalement des mètres et des kilomètres.

  • Regardons maintenant la distance entre Little A et Little B
127.0.0.1:6379> GEODIST location a b km
"0.8821"

Vous pouvez voir qu'il y a 0,88 kilomètres entre Little A et Little B

Prenons un regarde encore La distance entre Little C et Little E

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

La différence entre eux est de près de 19 kilomètres.

Obtenir les informations de localisation de l'adresse

membre clé geopos [membre ...]

Venez Regardez les informations de longitude et de latitude de l'adresse de Xiao D

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

Obtenez la collection d'informations géographiques dans la plage d'emplacement spécifiée

clé géoratius longitude latitude rayon km|ft|mi [aveccoord] [avecdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key] georadiusbymember clé membre radiusm km|ft|mi [withcoord] [withdist ] [ withhash] [COUNT count] [asc|desc] [store key] [storedist key]

Ces deux commandes sont légèrement plus compliquées que les autres. Jetons un coup d'œil à ces deux commandes ensemble. Les fonctions de ces deux commandes sont fondamentalement similaires. La principale différence est que la première commande donne la longitude et la latitude spécifiques, tandis que la seconde commande ne donne que le nom du membre. Par exemple, je veux connaître la distance entre les membres et la montagne Dashu à Hefei. Étant donné que les informations de longitude et de latitude de la montagne Dashu n'ont pas été stockées dans Redis, nous devons utiliser la première commande pour saisir la longitude et la latitude de la montagne Dashu. Pour un autre exemple, si vous souhaitez déterminer la distance entre les autres membres et les coordonnées de Little A, vous pouvez utiliser la deuxième commande et saisir directement le membre Little A.

le rayon et les unités suivantes sont des informations obligatoires, spécifiant la distance du rayon dans lequel rechercher.

Les coordonnées de la montagne Dashu à Hefei sont 117.175571,31.846746

# 查看离大蜀山10km的成员有哪些
127.0.0.1:6379> GEORADIUS location 117.175571 31.846746 10 km
1) "e"
2) "a"
3) "b"
Vous pouvez voir que le petit e, le petit a et le petit b sont relativement proches de la montagne Dashu, à moins de 10 km.

WITHCOORD : renvoie ensemble la longitude et la latitude de l'élément de localisation

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"

Comme vous pouvez le voir, en plus des membres, la page d'informations de localisation du membre est également incluse Étant donné

withdist : le résultat renvoyé inclut la distance depuis la position du nœud central

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"

Vous pouvez voir que le petit E est à 1,62 kilomètres de Da Shushan, et le petit A est à 1,62 kilomètres de la montagne Da Shu. Shushan est à 6,15 kilomètres et Little B est à 5,67 kilomètres de Shushan.

withhash : Cette commande peut être ignorée et fondamentalement non utilisée

COUNT count : Spécifiez le nombre de résultats renvoyés.

asc|desc : Les résultats renvoyés sont par ordre croissant ou décroissant en fonction de la distance par rapport au nœud central.

clé de liste stockée : enregistre la distance du résultat renvoyé entre le nœud central et la clé spécifiée.

# 获取离大蜀山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"

Combat pratique

Après avoir introduit les connaissances ci-dessus, vous pouvez utiliser PHP combiné avec Redis pour compléter le shake pour trouver des personnes fonction à proximité. Tout d’abord, enregistrez les informations de localisation des membres.

伪代码如下:

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的使用已经成为程序员必备的技能了。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn