C# 如何构建涉及大量地理位置计算的应用程序?

C# 如何构建涉及大量地理位置计算的应用程序?,c#,mongodb,redis,azure-cosmosdb,asp.net-core-webapi,C#,Mongodb,Redis,Azure Cosmosdb,Asp.net Core Webapi,我正在尝试创建一个简单的社交网络应用程序,从后端开始 应用程序说明 当用户打开应用程序时,将根据其地理位置、年龄和性别显示用户列表 一个用户已被查看,他将不再显示 技术 我正在使用Azure CosmosDB(MongoDB实现)和Azure Redis缓存来存储文档 我处理问题的方法 我将所有用户数据库保存在cosmosdb中。我根据地理坐标、年龄和性别偏好过滤器查询用户ID,并将结果限制为5000 我还应用了一个以上的过滤器,这是如果一个用户已经被视为过滤器。我正在维护一个集合,其中每个用户

我正在尝试创建一个简单的社交网络应用程序,从后端开始

应用程序说明 当用户打开应用程序时,将根据其地理位置、年龄和性别显示用户列表

一个用户已被查看,他将不再显示

技术 我正在使用Azure CosmosDB(MongoDB实现)和Azure Redis缓存来存储文档

我处理问题的方法 我将所有用户数据库保存在cosmosdb中。我根据地理坐标、年龄和性别偏好过滤器查询用户ID,并将结果限制为5000

我还应用了一个以上的过滤器,这是如果一个用户已经被视为过滤器。我正在维护一个集合,其中每个用户查看的所有用户ID都将保存为文档

这是我第一次从cosmosdb获得5000个id,并将4950放入redis缓存(有一个过期时间)。使用剩余的50个ID,我将从cosmosdb获取用户,并将其作为api调用的响应返回。对于后续调用,我从redis缓存中获取下50个ID,并获取这些用户并作为响应返回

我面临的问题 获取5000个用户是一个耗时的步骤,因为它涉及地理位置计算和其他过滤。我创建了一个示例用户数据库,在100英里半径范围内有近200万用户,根据我的偏好,即年龄和性别,如果我没有应用5000个限制,我将获得100000个用户。 这样做大约需要25秒

应用5000限制将仅在最初运行查询1-1.5秒。当用户被浏览时购买,即不在($nin)时,过滤器将排除最终会增加的5000个ID。从缓存中获取所需的时间很快,但当缓存耗尽或过期时,我们必须点击cosmos db查询5000多个用户,这将需要更多的时间,因为他已经查看的用户不断增加

统计数据 时间格式以小时:分钟:秒为单位。 它只是为了性能统计而执行的。实际的Api请求每次将提供50个用户(大部分时间来自缓存)

第一次

获得5000场比赛的时间是00:00:01.22

设置已查看ID的时间为00:00:00.06

第二次

获得5000场比赛的时间是00:00:02.49

设置已查看ID的时间为00:00:00.67

: :

第十五次

获得5000场比赛的时间是00:00:23.05

设置已查看ID的时间为00:00:09.23

问题

如何改进体系结构以获得更好的性能?Uber、Tinder等涉及用户地理位置计算的应用程序如何构建其应用程序?有没有更好的方法来建模问题或数据


任何帮助都将不胜感激。谢谢。

200万用户就足够了,您需要开始使用一个好的索引策略来进行数据库查询。地理查询提供了一个独特的索引问题,因为它们是对两个相关变量(即经度和纬度)的搜索

这篇文章很好地描述了MicrosoftSQLServer是如何完成其任务的,同时也很好地概括了索引问题


虽然我个人没有使用过它,但CosmoDB现在似乎也对此有一些支持。请参阅和。

200万用户就足够了,您需要开始使用一个好的索引策略来进行数据库查询。地理查询提供了一个独特的索引问题,因为它们是对两个相关变量(即经度和纬度)的搜索

这篇文章很好地描述了MicrosoftSQLServer是如何完成其任务的,同时也很好地概括了索引问题


虽然我个人没有使用过它,但CosmoDB现在似乎也对此有一些支持。请参见和。

我要做的第一件事是稍微重新考虑您的期望值-如果附近没有匹配项(或即使有匹配项),只需查找50或5000(或任意n个)最近的项可能需要较长的搜索时间,但如果您的数据库已正确索引,您可以在某个点的半径r内非常高效地搜索,然后按距离对结果进行排序。如果你有或期望有大量的坐标,我建议你做几次,换言之,搜索100米范围内的所有比赛,按距离排序,然后如果你需要更多,搜索500米范围内的所有比赛,排除你已经看到的比赛,等等,最多10公里或25公里,或者你的应用程序要求的任何比赛


MongoDB有一个可用于地理空间坐标(基本上是一个划分为B+树的世界地图)。允许您指定最小和最大距离,并默认按距离排序,因此对于这种基于距离的分层搜索非常方便。但是,如果尚未将坐标(在DB和查询中)格式化为GeoJSON点对象,则必须将其格式化为GeoJSON点对象

我要做的第一件事是稍微重新考虑一下您的期望值-如果附近没有匹配项(或即使有匹配项),只需查找50或5000(或任意n个)最近的项目可能需要很长的搜索时间,但如果您的数据库正确索引,您可以在点的半径r内非常高效地搜索,然后按距离对结果进行排序。如果你有或期望有大量的坐标,我建议你做几次,换言之,搜索100米范围内的所有比赛,按距离排序,然后如果你需要更多,搜索500米范围内的所有比赛,排除你已经看到的比赛,等等,最多10公里或25公里,或者你的应用程序要求的任何比赛

MongoDB有一个可用于地理空间坐标(基本上是一个划分为B+树的世界地图)。允许您指定最小值和最大值