基于位置的水平可伸缩约会app数据库模型

时间:2016-07-31 14:56:37

标签: database algorithm architecture cassandra redis

我正在评估类似于Tinder的位置基础约会应用程序的后端。

  • 应用功能会显示附近的在线用户(包含性别和年龄过滤器)
  • 一些数据库引擎是Redis,Cassandra,MySQL Cluster
  • 应用程序应通过在高流量时添加节点来水平扩展

经过研究,我很困惑是否有一个共同的最佳实践"数据模型,算法。 我的方法是使用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

我缺乏经验,如果对数百万并发用户进行扩展,则无法预见潜在的问题。

希望任何退伍军人都能解决问题。

4 个答案:

答案 0 :(得分:3)

对于您的用例,mongodb将是一个不错的选择。

  1. 您可以将每个用户及其当前位置存储在单个文档中。

  2. 在要进行查询的字段上创建索引,例如年龄,性别,地点

  3. 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。

Redis Geo Tutorial

答案 3 :(得分:1)

我也会根据MongoDB罗盘开发的要求支持MongoDB,你也可以看到你的地理空间数据.mongodb罗盘文档的链接是“https://docs.mongodb.com/compass/getting-started/”。