Maison > Article > base de données > Utilisez Redis pour compléter la fonction de tremblement de WeChat
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.
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 D127.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.
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 central127.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éeCOUNT 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. 伪代码如下: 然后,获取附近的人的信息 使用redis可以大大方便开发人员,丰富的API可以完成各种各样的需求,Redis的使用已经成为程序员必备的技能了。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;
}
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!