我正在评估类似于Tinder的位置基础约会应用程序的后端。
经过研究,我很困惑是否有一个共同的最佳实践"数据模型,算法。 我的方法是使用Redis Cluster:
// Store all online users in same location (city) to a Set. In this case, store user:1 to New York set
SADD location:NewYork 1
// Store all users age to Sorted Set. In this case, user:1 has age 30
ZADD age 30 "1"
// Retrieve users in NewYork age from 20 to 40
ZINTERSTORE tmpkey 2 location:NewYork age AGGREGATE MAX
ZRANGEBYSCORE tmpkey 20 40
我缺乏经验,如果对数百万并发用户进行扩展,则无法预见潜在的问题。
希望任何退伍军人都能解决问题。
答案 0 :(得分:3)
对于您的用例,mongodb将是一个不错的选择。
您可以将每个用户及其当前位置存储在单个文档中。
在要进行查询的字段上创建索引,例如年龄,性别,地点
Mongodb内置了对地理空间查询的支持,因此很容易找到距其他用户1公里范围内的用户。
答案 1 :(得分:2)
大多数noSQL地理/邻近索引功能都依赖于GeoHash算法
http://www.bigfastblog.com/geohash-intro
理解它是如何工作的,这是一件好事,它真的非常吸引人。此技术还可用于在关系数据库上创建高效索引。
Redis确实有本机支持,但如果您使用的是ElastiCache,那么该版本的Redis不会,并且您需要在您的API中管理此内容。
任何关系数据库都将为您提供最灵活,最简单的解决方案。您可能遇到的问题是查询时间。如果您要对数据库实例上的搜索进行优化(可能有一个搜索数据库与个人资料/内容数据分开),那么可以将整个索引放在内存中以便快速完成结果
我还可以谈谈Redis:排序的集合操作非常快,但你需要过滤。您必须扫描附近的结果并查找元信息以过滤,或为您可能需要的每个过滤器组合维护单独的集。第一个会有更多的性能开销。第二个要求您自己管理索引。 EG:如果有人删除了他们的一个喜欢的内容怎么办?如果他们四处走动怎么办?
它不是闪存或幻想,但在大多数情况下,您需要搜索一系列数据,关系数据库因其简单性和支持而获胜。将您的搜索视为主源的副本,并且您可以随时迁移到另一个解决方案,或者在将来需要时重新进行分片/扩展。
答案 2 :(得分:1)
您可能对Redis Geo API感兴趣。
Geo API由一组新命令组成,这些命令为在Redis键中存储和查询经度/纬度坐标对提供了支持。 GeoSet是包含一组(x,y)坐标的数据结构的名称。实际上,没有任何新的数据结构:GeoSet只是一个Redis SortedSet。
答案 3 :(得分:1)
我也会根据MongoDB罗盘开发的要求支持MongoDB,你也可以看到你的地理空间数据.mongodb罗盘文档的链接是“https://docs.mongodb.com/compass/getting-started/”。