Comment utiliser Redis et géo recherche de proximité, de trouver deux utilisateurs au même endroit?
Je veux mettre en œuvre un service qui, compte tenu des utilisateurs geo coordonnées, peuvent détecter si deux utilisateurs sont dans le même emplacement en temps réel.
Pour ce faire, en temps réel et à grande échelle, et il semble que je devrais aller avec un en mémoire distribuée de la banque de données comme le Redis. J'ai fait des recherches à l'aide de geohashing, mais le problème est que les points proches les uns des autres peuvent ne partagent pas toujours le même hachage préfixe. Et geohashing peut-être exagéré car je cherche à savoir si les deux utilisateurs sont assez proches où ils sont debout à côté les uns des autres.
La solution la plus simple est, bien sûr, juste pour tester si les paires de geo coordonnées de l'automne dans une petite distance les uns des autres. Mais autant que je sache, Redis et d'autres en mémoire datastorse n'ont pas d'indexation géospatiales pour soutenir ce genre de look-up.
Quelle est la meilleure façon d'aller sur la mise en œuvre de cette?
- Autant que j'aime le redis, je pense que la meilleure option est d'utiliser quelque chose d'autre de cette recherche. Il existe plusieurs outils là-bas qui ne supportent indexation géospatiales, y compris elasticsearch, mongodb, et PostgreSQL (avec PostGIS). Même MySQL supporte les SIG extensions. L'ensemble de ces serait mieux que le redis dans ce cas d'utilisation particulier.
- Mais qui sont ces outils assez rapide pour faire le look en temps réel? Je veux quelque chose qui peut effectuer la recherche presque instantanément.
- Lorsqu'il est correctement configuré et indexé toutes les solutions mentionnées fournir des quasi-instantanée de recherche. Elasticsearch est très très rapide et a un support intégré pour la mise en cluster, permettant de s'adapter à des charges incroyables sans trop d'effort.
- Oui, mais sont celles qui conviennent pour un système en temps réel? Quelle est la vitesse de l'écriture, si elle a besoin d'aller sur le disque et l'index de l'entrée? C'est pourquoi je cherchais à en mémoire des solutions pour les écritures rapides.
- En fait ElasticSearch ne prend pas en charge les recherches de proximité pour les distances inférieures à 1 km. Voir le post original.
- Oui, ils sont adaptés pour cette tâche
- J'ai besoin d'une recherche de proximité, qui peut trouver des points de moins que le < 1 km de l'établissement. Je veux détecter si deux utilisateurs sont au même endroit. ElasticSearch ne prend pas en charge les recherches de proximité pour les distances inférieures à 1 km. Voir le post original.
- Il prend en charge les recherches de proximité à moins de 1km. La syntaxe est un peu difficile. Vous devez utiliser 0,2 km de représenter 200m. Je n'ai pas tenté quelque chose en dessous de 100m si.
Vous devez vous connecter pour publier un commentaire.
Cette fonctionnalité est cuit dans des Redis 3.2+.
Mais pour les anciennes versions, le problème existe toujours. J'ai pris Yin Qiwen de la réponse et a créé un module pour le Nœud, et vous pouvez voir comment il utilise Redis en examinant le code. Ses instructions sont parfaits et j'ai été capable de les suivre pour de meilleurs résultats.
https://github.com/arjunmehta/node-georedis
Le même algorithme est essentiellement ce qui est utilisé pour le natif de commandes.
Il est très rapide, et permet d'éviter toute sorte d'intersections/haversine type d'opérations. La chose la plus cool (je pense) sur le Yin Qiwen de la méthode est que la plupart des calculs intenses parties de l'algorithme peut être distribué à des clients (au lieu de tous se passe dans la base de données ou sur le serveur).
Il n'est pas 100% précis et utilise préconfiguré distance étapes, mais pour la plupart des applications que vous n'aurez pas besoin de précision, j'imagine.
J'ai aussi paraphrasé Yin Qiwen de l'article à la Le SIG de la pile d'échange.
Désolé pour tous les liens. 😛
Généralement, cela pourrait être fait par GeoHash et Redis l'ensemble trié. Il est une conception que j'ai écrit avant de parler de la façon de mettre en œuvre un index spatial de service sur le redis.
https://github.com/yinqiwen/ardb/wiki/Spatial-Index
Peut-être vous pouvez essayer celui-ci:
Redis Géographie Édition
Vous voulez vraiment essayer, ça fonctionne super.
🙂
Je me rends compte ce n'est pas la réponse à votre question... mais je ne pense pas que c'est le bon outil.
PostgreSQL + PostGIS pouvez effectuer vraiment, vraiment bien. Vous pouvez configurer PostgreSQL à peu près l'exécuter en tant qu'une grande partie de la base de données peuvent être stockées en mémoire.
PostGIS utilise (je pense) rtree indices, il est donc extrêmement rapide d'effectuer le type de recherche qui vous intéresse.
À l'aide d'un client qui déclenche websocket demandes vous permettra d'exécuter assez bien en temps réel. À tout moment votre backend reçoit l'une des personnes les coordonnées GPS; effectuer l'spatiale de recherche; et aviser applicable clients à travers les websockets.
Le Redis géographie édition mentionné par d'autres réponses dans ce fil de discussion a été intégrée dans le Redis depuis la version 3.2 (voir aussi ce commentaire précédent).
Vous pouvez trouver les nouvelles commandes ici (en version bêta pour l'instant) :
Tarantool base de données conserve les données en mémoire, les pousse à disque comme les journaux des transactions, a RTree de type index spatial (pas seulement 2 dimensions) et un numéro de nice opérations sur cet indice (confinement, qui se chevauchent, de la distance).
- Je l'utiliser dans un projet commercial pour le stockage et l'interrogation des documents qui décrivent les objets dans l'espace 3D.
http://tarantool.org/doc/book/box/box_index.html
https://github.com/tarantool/tarantool/wiki/R-tree-index-quick-start-and-usage
Client Standard et les exemples sont en Lua, mais il y a le couple de d'autres clients développé par la base de données des auteurs. J'utilise Java client dans un Scala application avec succès.
La base de données est également très rapide - voici scientifiques comparaison avec d'autres bases de données (en mettant de côté un aspect de l'organisation spatiale db):
http://airccse.org/journal/ijdms/papers/6314ijdms01.pdf
Je voudrais partager un exemple de code Java pour le Redis Géographie édition.