最小化服务请求
Minimize service requests
我得到了一个 WCF 服务,从中我可以使用合同方法从一个点到另一个点(纬度和经度)以米为单位的距离:
public double GetDistance(double originLat, double originLng, double destLat, double destLng)
其中一个点是常量点,另一个点是我需要根据收到的一些其他信息从数据库中提取的几个位置之一。最终目标是获得距离该常数点最近的 5 个位置。
想象一下,如果使用 WCF 服务每个请求都要花钱。使用最直接的方法,我需要从数据库中获取所有位置,然后需要从服务中为每个位置发出请求。是有没有办法让它变得更好,比如以某种方式过滤数据库中的位置以减少对服务的请求?
此方法只是一个数学函数,因此无需将其托管在 WCF 服务中。无论调用此服务的是什么,都应该只拥有此方法的自己的本地版本。这将通过消除服务请求来最大限度地减少服务请求,而且速度会快得惊人。
从其他详细信息来看,您似乎也在执行 returns 多个点的查询,并且您想从这些点中找到最接近给定位置的五个点。
缓存仅在您以一定频率发出相同请求时才有用。 returns 点集合的第一个查询可能会重复,因此缓存给定查询的点集合可能有一定意义。
但是除非您与这些点进行比较的位置也经常重复,否则添加它会弄乱您的缓存。
例如,这可能受益于缓存...
Points[] GetPointsUsingSomeQuery(queryInput)
...如果 queryInput
一遍又一遍地重复。
但是如果你把它改成这样...
Points[] GetPointsClosestToSomeLocation(queryInput, Point location)
...如果 location
不经常重复,那么缓存的任何好处都会消失 window。您只会缓存一堆数据并且永远不会使用它,因为您永远不会两次发出完全相同的请求。
这也是缓存可能对您的原始功能没有帮助的原因。除非您打算一遍又一遍地重复精确组合,否则您永远不会在缓存中找到您要查找的结果。即使它偶尔重复,也可能不值得。您仍然会发出大量请求,并且还会在缓存中存储大量未使用的数据。
你最好的办法是克服任何限制,说你不能在本地执行这个数学函数。
如果您要查找 2 long/lat 点之间的点到点距离或飞行距离,那么您可以查看以下答案:
SO Answer
如果您通过公路检查距离,那么您唯一的选择是在经常调用的情况下缓存这些点之间的结果。当心缓存,您的供应商可能会禁止这样做并最好检查他们的条款和条件。
最终答案是将(经度,纬度)作为(x,y)坐标,计算起点到当前(x,y)的直线长度,公式为:
d = sqrt((x1-x2)^2 + (y1-y2)^2)
我们首先读取5个点,计算长度并保持最大距离和点到最大距离(为了保持多个距离和点而使用堆栈或列表)。在我们读取的每个点,我们简单地计算距离并在新距离较低时更新距离和点
我得到了一个 WCF 服务,从中我可以使用合同方法从一个点到另一个点(纬度和经度)以米为单位的距离:
public double GetDistance(double originLat, double originLng, double destLat, double destLng)
其中一个点是常量点,另一个点是我需要根据收到的一些其他信息从数据库中提取的几个位置之一。最终目标是获得距离该常数点最近的 5 个位置。
想象一下,如果使用 WCF 服务每个请求都要花钱。使用最直接的方法,我需要从数据库中获取所有位置,然后需要从服务中为每个位置发出请求。是有没有办法让它变得更好,比如以某种方式过滤数据库中的位置以减少对服务的请求?
此方法只是一个数学函数,因此无需将其托管在 WCF 服务中。无论调用此服务的是什么,都应该只拥有此方法的自己的本地版本。这将通过消除服务请求来最大限度地减少服务请求,而且速度会快得惊人。
从其他详细信息来看,您似乎也在执行 returns 多个点的查询,并且您想从这些点中找到最接近给定位置的五个点。
缓存仅在您以一定频率发出相同请求时才有用。 returns 点集合的第一个查询可能会重复,因此缓存给定查询的点集合可能有一定意义。
但是除非您与这些点进行比较的位置也经常重复,否则添加它会弄乱您的缓存。
例如,这可能受益于缓存...
Points[] GetPointsUsingSomeQuery(queryInput)
...如果 queryInput
一遍又一遍地重复。
但是如果你把它改成这样...
Points[] GetPointsClosestToSomeLocation(queryInput, Point location)
...如果 location
不经常重复,那么缓存的任何好处都会消失 window。您只会缓存一堆数据并且永远不会使用它,因为您永远不会两次发出完全相同的请求。
这也是缓存可能对您的原始功能没有帮助的原因。除非您打算一遍又一遍地重复精确组合,否则您永远不会在缓存中找到您要查找的结果。即使它偶尔重复,也可能不值得。您仍然会发出大量请求,并且还会在缓存中存储大量未使用的数据。
你最好的办法是克服任何限制,说你不能在本地执行这个数学函数。
如果您要查找 2 long/lat 点之间的点到点距离或飞行距离,那么您可以查看以下答案:
SO Answer
如果您通过公路检查距离,那么您唯一的选择是在经常调用的情况下缓存这些点之间的结果。当心缓存,您的供应商可能会禁止这样做并最好检查他们的条款和条件。
最终答案是将(经度,纬度)作为(x,y)坐标,计算起点到当前(x,y)的直线长度,公式为:
d = sqrt((x1-x2)^2 + (y1-y2)^2)
我们首先读取5个点,计算长度并保持最大距离和点到最大距离(为了保持多个距离和点而使用堆栈或列表)。在我们读取的每个点,我们简单地计算距离并在新距离较低时更新距离和点