经纬度计算性能对比-MongoDB-Elasticsearch-与 (经纬度计算性质是什么)
MongoDB和Elasticsearch都支持计算经纬度距离,但它们的性能体现或者因经常使用场景和数据规模而异。
性能对比
1、数据索引和存储
MongoDB经常使用天文空间索引(2dsphere)来支持经纬度数据的查问和计算距离,而Elasticsearch经常使用经纬度字段的天文距离查问。在存储和索引数据时,MongoDB或者须要更多的存储空间和计算资源来构建天文空间索引。
2、查问性能
Elasticsearch的天文位置查问理论比MongoDB的查问更快,由于它经常使用更高效的查问引擎和数据结构。Elasticsearch经常使用倒排索引来极速定位蕴含特定天文坐标的文档,而MongoDB则经常使用相似R-tree的数据结构来口头相似的查问。
3、数据规模
假设数据规模较大,MongoDB或者会在处置天文位置查问时遇到性能瓶颈,由于它须要扫描整个索引来找到合乎条件的文档。而Elasticsearch经常使用散布式架构和倒排索引,可以更有效地处置大规模数据。
4、裁减性
Elasticsearch具备更好的水平裁减性,可以处置大规模的数据和并发查问。而MongoDB在处置大规模数据时或者会遇到性能瓶颈,由于它关键针对单个主机的性能优化。
选用数据库
1、数据规模和查问性能需求
假设数据规模较大且须要极速口头天文位置查问,Elasticsearch或者更适宜。假设数据规模较小且天文位置查问不是关键需求,MongoDB或者更适宜。
2、裁减性和高可用性需求
假设须要处置大规模数据和高并发查问,并且须要水平裁减和缺点复原才干,Elasticsearch或者是更好的选用。假设这些需求不是关键思考要素,MongoDB或者足够满足需求。
3、集成和生态系统
思考与现有系统和生态系统的集成水平。假设曾经经常使用了MongoDB或Elasticsearch,并且它们提供了所需的特性和配置,那么继续经常使用这些数据库或者是理智的选用。
4、老本和资源思考
最后,须要思考老本和资源需求。MongoDB和Elasticsearch都是弱小的数据库系统,但它们的容许和保养老本或者有所不同。依据组织的估算和资源需求来选用适宜的数据库是很关键的。
mongodb计算经纬度API
在MongoDB中,可以经常使用天文空间索引和操作符来依据经纬度计算距离。MongoDB提供了几种不同的方法来口头这样的操作。
经常使用$nearSphere运算符:
db.collection.find({location:{$nearSphere:{$geometry:{type:"Point",coordinates:[经度,纬度]},$maxDistance:100//最大距离(以千米为单位)}}})
这个查问将前往与指定经纬度距离在100千米范围内的一切文档。你可以依据须要调整最大距离。
经常使用$geoWithin运算符:
db.collection.find({location:{$geoWithin:{$geometry:{type:"Polygon",coordinates:[多边形坐标数组]//多边形由一个或多个经纬度点组成}}}})
这个查问将前往位于指定多边形内的一切文档。你须要提供一个多边形的坐标数组,由示意多边形顶点的经纬度坐标组成。
经常使用聚合管道:
假设你须要更复杂的距离计算或排序,可以经常使用MongoDB的聚合管道。经过聚合管道,你可以经常使用match、geoNear和$project等阶段来处置数据并计算距离。以下是一个便捷的示例:
db.collection.aggregate([{$match:{location:{$nearSphere:{$geometry:{type:"Point",coordinates:[经度,纬度]},$maxDistance:100//最大距离(以千米为单位)}}}},{$project:{_id:1,distance:{$cosineDistance:{$geometry:"$$location"}}//计算距离(以弧度为单位)并将其存储在"distance"字段中}}])
这个聚合查问将前往与指定经纬度距离在100千米范围内的一切文档,并计算每个文档的距离,将其存储在"distance"字段中。你可以依据须要调整最大距离和经常使用的距离计算方法。
elasticsearch计算经纬度API
Elasticsearch提供了一些用于处置天文空间数据的API,可以用来计算经纬度。以下是一些罕用的API:
GeoDistanceQuery:用于依据给定的经纬度和距离计算出周围必定范围内的其余经纬度坐标。这个查问可以用来查找某个地点周围的商家、用户等。
GET/_search{"query":{"bool":{"must":{"match_all":{}},"filter":{"geo_distance":{"distance":"200km","location":{"lat":40.00,"lon":-70.00}}}}}}
GeoDistanceAggregation:用于对必定范围内的经纬度数据启动聚合剖析,可以计算出每个经纬度范围内的数据量、平均值等目的。这个聚合可以用来统计不同区域的用户数量、订单量等。
GET/_search{"size":0,"aggs":{"sales_over_time":{"geo_distance":{"field":"location","origin":"40.00,-70.00","unit":"km","order":{"_key":"desc"},"size":10,"aggs":{"total_sales":{"sum":{"field":"price"}}}}}}}
![经纬度计算性质是什么](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
外卖平台计算经纬度
外卖平台计算经纬度普通会经常使用支持天文空间数据存储和查问的数据库,比如MongoDB或Elasticsearch。
这些数据库提供了将详细的结构化文本地址转换为经纬度坐标的才干,以便于将送餐地址文本转换为经纬度,作为骑手送餐的目的经纬度。
至于详细的算法,或者会因平台而异,但普通来说,外卖平台会经常使用天文编码(GeoCoding)算法将地址文本转换为经纬度。这种算法理论基于反向天文编码(ReverseGeoCoding)技术,它经过将给定的地址与天文数据库中的位置信息启动婚配,从而确定该地址的经纬度坐标。
须要留意的是,GeoCoding算法的准确性间接影响到骑手送达效率,因此外卖平台或者会驳回高效的GeoCoding算法和高品质的天文数据库来提高定位的准确性和效率。
同时,为了顺应不同地域和不同精度的需求,外卖平台也或者会对经纬度数据启动必定水平的优化和缩放。
以下是一个便捷的示例,展示如何经常使用GeoCodingAPI将地址转换为经纬度:
在这个示例中,咱们经常使用了GoogleMaps的GeoCodingAPI来将给定的地址转换为经纬度坐标。首先,咱们构建了一个GeoApiContext对象,并指定了API密钥。而后,咱们经常使用GeocodingApi.geocode()方法发送GeoCoding恳求,并期待照应前往。假设照应形态为GeocodingStatus.OK,咱们失掉第一个结果中的天文位置信息,并打印经纬度坐标。假设找不到结果或出现其余失误,咱们将打印相应的失误信息。
综上所述,不可便捷地回答哪个数据库在计算经纬度距离方面具备更好的性能。选用哪个数据库取决于详细的经常使用场景、数据规模和性能需求。
Logstash 五种替代方案(Filebeat、Fluentd、rsyslog、syslog-ng 以及 Logagent
优势 Logstash 主要的有点就是它的灵活性,这还主要因为它有很多插件。然后它清楚的文档已经直白的配置格式让它可以再多种场景下应用。这样的良性循环让我们可以在网上找到很多资源,几乎可以处理任何问题。以下是一些例子:5 minute intro reindexing data in Elasticsearch parsing Elasticsearch logs rewriting Elasticsearch slowlogs so you can replay them with JMeter
劣势 Logstash 致命的问题是它的性能以及资源消耗(默认的堆大小是 1GB)。尽管它的性能在近几年已经有很大提升,与它的替代者们相比还是要慢很多的。这里有Logstash 与 rsyslog 性能对比 以及 Logstash 与 filebeat 的性能对比 。它在大数据量的情况下会是个问题。
优势 Filebeat 只是一个二进制文件没有任何依赖。它占用资源极少,尽管它还十分年轻,正式因为它简单,所以几乎没有什么可以出错的地方,所以它的可靠性还是很高的。它也为我们提供了很多可以调节的点,例如:它以何种方式搜索新的文件,以及当文件有一段时间没有发生变化时,何时选择关闭文件句柄。
劣势 Filebeat 的应用范围十分有限,所以在某些场景下我们会碰到问题。例如,如果使用 Logstash 作为下游管道,我们同样会遇到性能问题。正因为如此,Filebeat 的范围在扩大。开始时,它只能将日志发送到 Logstash 和 Elasticsearch,而现在它可以将日志发送给 Kafka 和 Redis,在 5.x 版本中,它还具备过滤的能力。 典型应用场景 Filebeat 在解决某些特定的问题时:日志存于文件,我们希望 将日志直接传输存储到 Elasticsearch 。这仅在我们只是抓去(grep)它们或者日志是存于 JSON 格式(Filebeat 可以解析 JSON)。或者如果打算使用 Elasticsearch 的 Ingest 功能对日志进行解析和丰富。 将日志发送到 Kafka/Redis 。所以另外一个传输工具(例如,Logstash 或自定义的 Kafka 消费者)可以进一步丰富和转发。这里假设选择的下游传输工具能够满足我们对功能和性能的要求
优势 可以获取 /var/log 下的所有信息,解析各种格式(Elasticsearch,Solr,MongoDB,Apache HTTPD等等),它可以掩盖敏感的数据信息,例如,个人验证信息(PII),出生年月日,信用卡号码,等等。它还可以基于 IP 做 GeoIP 丰富地理位置信息(例如,access logs)。同样,它轻量又快速,可以将其置入任何日志块中。在新的 2.0 版本中,它以第三方 模块化方式增加了支持对输入输出的处理插件。重要的是 Logagent 有本地缓冲,所以不像 Logstash ,在数据传输目的地不可用时会丢失日志。
劣势 尽管 Logagent 有些比较有意思的功能(例如,接收 Heroku 或 CloudFoundry 日志),但是它并没有 Logstash 灵活。 典型应用场景 Logagent 作为一个可以做所有事情的传输工具是值得选择的(提取、解析、缓冲和传输)。
优势 rsyslog 是经测试过的最快的传输工具。如果只是将它作为一个简单的 router/shipper 使用,几乎所有的机器都会受带宽的限制,但是它非常擅长处理解析多个规则。它基于语法的模块( mmnormalize )无论规则数目如何增加,它的处理速度始终是 线性增长 的。这也就意味着,如果当规则在 20-30 条时,如解析 Cisco 日志时,它的性能可以大大超过基于正则式解析的 grok ,达到 100 倍(当然,这也取决于 grok 的实现以及 liblognorm 的版本)。 它同时也是我们能找到的最轻的解析器,当然这也取决于我们配置的缓冲。
劣势 rsyslog 的配置工作需要更大的代价(这里有一些 例子 ),这让两件事情非常困难:文档 难以搜索和阅读,特别是那些对术语比较陌生的开发者。 5.x 以上的版本格式不太一样(它扩展了 syslogd 的配置格式,同时也仍然支持旧的格式),尽管新的格式可以兼容旧格式,但是新的特性(例如,Elasticsearch 的输出)只在新的配置下才有效,然后旧的插件(例如,Postgres 输出)只在旧格式下支持。
尽管在配置稳定的情况下,rsyslog 是可靠的(它自身也提供多种配置方式,最终都可以获得相同的结果),它还是存在一些 bug 。
可以将 syslog-ng 当作 rsyslog 的替代品(尽管历史上它们是两种不同的方式)。它也是一个模块化的 syslog 守护进程,但是它可以做的事情要比 syslog 多。它可以接收磁盘缓冲并将 Elasticsearch HTTP 作为输出。它使用PatternDB作为语法解析的基础,作为 Elasticsearch 的传输工具,它是一个不错的选择。 优势 和 rsyslog 一样,作为一个轻量级的传输工具,它的性能也非常好。它曾经比 rsyslog 慢很多,但是 2 年前能达到570K Logs/s 的性能 并不差。并不像 rsyslog ,它有着明确一致的配置格式以及完好的文档。 劣势 Linux 发布版本转向使用 rsyslog 的原因是 syslog-ng 高级版曾经有很多功能在开源版中都存在,但是后来又有所限制。我们这里只关注与开源版本,所有的日志传输工具都是开源的。现在又有所变化,例如磁盘缓冲,曾经是高级版存在的特性,现在开源版也有。但有些特性,例如带有应用层的通知的可靠传输协议(reliable delivery protocol)还没有在开源版本中。
Java数据库,哪个更好用?
我将推荐给你们10个最高效的Java数据库1、MongoDB——最受欢迎,跨平台,面向文档的数据库MongoDB是一个基于分布式文件存储的数据库,使用C++语言编写。 旨在为Web应用提供可扩展的高性能数据存储解决方案。 应用性能高低依赖于数据库性能,MongoDB则是非关系数据库中功能最丰富,最像关系数据库的,随着MongDB 3.4版本发布,其应用场景适用能力得到了进一步拓展。 MongoDB的核心优势就是灵活的文档模型、高可用复制集、可扩展分片集群。 你可以试着从几大方面了解MongoDB,如实时监控MongoDB工具、内存使用量和页面错误、连接数、数据库操作、复制集等。 2、Elasticsearch ——为云构建的分布式RESTful搜索引擎ElasticSearch是基于Lucene的搜索服务器。 它提供了分布式多用户能力的全文搜索引擎,基于RESTful web接口。 Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是比较流行的企业级搜索引擎。 ElasticSearch不仅是一个全文本搜索引擎,还是一个分布式实时文档存储,其中每个field均是被索引的数据且可被搜索;也是一个带实时分析功能的分布式搜索引擎,并且能够扩展至数以百计的服务器存储及处理PB级的数据。 ElasticSearch在底层利用Lucene完成其索引功能,因此其许多基本概念源于Lucene。 3、Cassandra——开源分布式数据库管理系统最初是由Facebook开发的,旨在处理许多商品服务器上的大量数据,提供高可用性,没有单点故障。 Apache Cassandra是一套开源分布式NoSQL数据库系统。 集Google BigTable的数据模型与Amazon Dynamo的完全分布式架构于一身。 于2008开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter等Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。 因Cassandra是用Java编写的,所以理论上在具有JDK6及以上版本的机器中都可以运行,官方测试的JDK还有OpenJDK 及Sun的JDK。 Cassandra的操作命令,类似于我们平时操作的关系数据库,对于熟悉MySQL的朋友来说,操作会很容易上手。 4、Redis ——开源(BSD许可)内存数据结构存储,用作数据库,缓存和消息代理Redis是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 Redis 有三个主要使其有别于其它很多竞争对手的特点:Redis是完全在内存中保存数据的数据库,使用磁盘只是为了持久性目的; Redis相比许多键值数据存储系统有相对丰富的数据类型; Redis可以将数据复制到任意数。 Redis 这么火,它都解决了哪些问题?5、Hazelcast ——基于Java的开源内存数据网格Hazelcast 是一种内存数据网格 in-memory data grid,提供Java程序员关键任务交易和万亿级内存应用。 虽然Hazelcast没有所谓的“Master”,但是仍然有一个Leader节点(the oldest member),这个概念与ZooKeeper中的Leader类似,但是实现原理却完全不同。 同时,Hazelcast中的数据是分布式的,每一个member持有部分数据和相应的backup数据,这点也与ZooKeeper不同。 Hazelcast的应用便捷性深受开发者喜欢,但如果要投入使用,还需要慎重考虑。 6、Ehcache——广泛使用的开源Java分布式缓存主要面向通用缓存、Java EE和轻量级容器。 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是hibernate中默认的CacheProvider。 主要特性有:快速简单,具有多种缓存策略;缓存数据有两级,内存和磁盘,因此无需担心容量问题;缓存数据会在虚拟机重启的过程中写入磁盘;可以通过RMI、可插入API等方式进行分布式缓存;具有缓存和缓存管理器的侦听接口;支持多缓存管理器实例,以及一个实例的多个缓存区域;提供Hibernate的缓存实现。 Ehcache介绍及整合Spring实现高速缓存。 7、Hadoop ——用Java编写的开源软件框架用于分布式存储,并对非常大的数据用户可以在不了解分布式底层细节的情况下,开发分布式程序。 充分利用集群进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop的框架最核心的设计就是:HDFS和MapReduce。 HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算。 8、Solr ——开源企业搜索平台,用Java编写,来自Apache Lucene项目Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。 用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 与ElasticSearch一样,同样是基于Lucene,但它对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化。 9、Spark ——Apache Software Foundation中最活跃的项目,是一个开源集群计算框架Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。 Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。 与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地。 10、Memcached ——通用分布式内存缓存系统Memcached是一套分布式快取系统,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。 Memcached作为高速运行的分布式缓存服务器,具有以下的特点:协议简单,基于libevent的事件处理,内置内存存储方式。 通过以上的分析,相信你就知道怎么选择了
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。