首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

听说你会架构设计?来,弄一个交友系统

此外,为了更高效地提供图片,我们通过 CDN 服务缓存了用户访问频率较高热门图片,以加速图片加载速度。...同时,考虑到地理位置亲近性因素,这个服务时常会与算法团队密切合作,确保推荐对象地理上也方便用户进行真实社交互动。...4.2 空间邻近算法 如何根据用户地理位置寻找距其一定范围内其他用户,也是交友系统中必不可少一个考虑点。 空间邻近算法是为了解决 给定一个点,找出距离其最近点 这一问题算法。...为了进一步查找邻近网格用户,可通过将所有叶子节点连成一个双向链表来实现(类型 B+ 树网状结构)。...3)Geohash 算法 Geohash 算法是一种将二维空间坐标编码为一维字符串方法,它可以有效地表示地理位置信息。 在交友系统中,Geohash 可以用来索引用户位置,以便快速查询附近用户。

24410

交友系统设计:哪种地理空间邻近算法更快?

Liao 面临技术挑战包括:面对海量用户,如何为其快速找到邻近的人,可以选择地理空间邻近算法有哪些?Liao 如何在这些算法中选择出最合适那个?...通常空间邻近算法有以下 4 种,我们一一进行分析,最终选择出最合适方案。...2、地理网格邻近算法 为了减少上述交集计算使用中间数据量,我们将整个地球用网格进行划分,如下图: 事实上,我们划分网格远比图中示意要密集得多,赤道附近,经、纬度方向每 10 公里一个网格。...动态网格也叫 4 叉树网格,在空间邻近算法中较为常用,也能满足 Liao 需求。但是编程实现稍稍有点麻烦,而且如果网格大小设计不合适,导致树高度太高,每次查找需要遍历路径太长,性能结果也比较差。...查找邻近好友时候,Liao 将先计算用户当前位置 GeoHash 值(5 个字符),然后从Hash 表中读取该 Hash 值对应所有用户,即在同一个网格内用户,进行匹配,将满足匹配条件对象返回给用户

19210
您找到你想要的搜索结果了吗?
是的
没有找到

持续搞【附近】系列---听说MongoDB是专业(三)

还是得好用才行 一直听说MongoDB才是【专业】搞地理空间查询,人家才是【专业】!相当长一段时间来,一说搞【附近】就会相当一批人脑海里就不自主浮想到MongoDB... ......上面横线才是榜样模板式回答,然而实际上对于我们这个庞大泥腿子群体而言,MongoDB最大优势是: 复制粘贴一下demo代码,CURD就能用 MongoDB地理空间索引分为两种类型: 2d索引...如果有曾经深入研究过MongoDB这两种地理空间索引实现老哥们,可以公众号发消息帮我double check一下是否正确。...后面我会抽空专门整理一篇关于标题类似于《人类关于N种地理空间索引实现方案横向大评测》之类文章,毕竟,当年为了搞【附近】我是曾经下过真功夫。...第三步:开始搞【附近】 我们将围绕经纬度(116.2092590332,40.0444375846)进行查找为了对演示结果心里有谱,请你将(116.2092590332,40.0444375846)也插入到

55930

持续搞【附近的人】---听说MongoDB是专业(三)

还是得好用才行 一直听说MongoDB才是【专业】搞地理空间查询,人家才是【专业】!相当长一段时间来,一说搞【附近的人】就会相当一批人脑海里就不自主浮想到MongoDB... ... ?...MongoDB地理空间索引分为两种类型: 2d索引,用于平面地图之流,反正也能用 2dsphere索引,用于地球儿表面的地理查询运算,推荐用法 先说2d索引,然而实际上MongoDB2d索引实现底层原理依然是...如果有曾经深入研究过MongoDB这两种地理空间索引实现老哥们,可以公众号发消息帮我double check一下是否正确。...后面我会抽空专门整理一篇关于标题类似于《人类关于N种地理空间索引实现方案横向大评测》之类文章,毕竟,当年为了搞【附近的人】我是曾经下过真功夫。...---- 第三步:开始搞【附近的人】 我们将围绕经纬度(116.2092590332,40.0444375846)进行查找为了对演示结果心里有谱,请你将(116.2092590332,40.0444375846

1.4K20

【戴嘉乐 IPFS】基于IPFS和GeoHash构建具有地理位置价值服务DDApp(理论篇)

[gmbr24wzye.png] 一、概述 1.1 项目意义 打造地理位置信息与区块链关系对象模型,建立一套 人->位置->真实世界->传递信任->价值转移->位置->人 生态模型,实现用区块链来索引真实世界愿景...它是一种层次化空间数据结构,将空间分为网格形状,是一种被称为z -阶空间填充曲线应用,下图中就是GeoHash算法中常用Peano曲线,一种四叉树线性编码方式。...我们已经知道现有的GeoHash算法使用是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大问题,因此在基于个人位置查询附近Poi信息时,首先筛选GeoHash编码相似的...mixIpfsHashByParam() FUNCTION 关联Ipfs数据方法 2.3 数据库对象映射 2.3.1 数据库选型 这是网友以 100万 poi 数据查询范围 3km 内点(最多取100...IPFS-Geo 意义:是一个具有地理位置特征IPFS智能对象,其元数据具备Geo相关特性,支持千万级别空间数据快速索引,对象内还提供LBS相关功能接口服务。

69110

HashMap设计原理和实现分析

中链表长度越短,所消耗查找时间就越低,最好就是一个中就一个Entry对象节点就好了!     ...我们知道,HashMap数目,即Entry[] table数组长度,由于数组是内存中连续存储单元,它空间代价是很大,但是它随机存取速度是Java集合中最快。...我们增大桶数量,而减少Entry链表长度,来提高从HashMap中读取数据速度。这是典型空间换时间策略。      ...这不是浪费了宝贵空间了吗?!   确实如此,但是为了尽可能第减少Entry链表长度,以提高HashMap存取性能,确定这个经验值。...加载因子过小,会提高HashMap查找效率,但同时也消耗了大量内存空间,加载因子过大,节省了空间,但是会导致HashMap查找效率降低。

35230

地理空间索引实现:z 曲线、希尔伯特曲线、四叉树, 最邻近几何特征查询、范围查询

空间索引 在谈论空间索引之前,我们必须了解数据索引概念:索引是为了提高数据集检索效率。...打个比喻,一本书目录就是这本书内容“索引”,我们查看感兴趣内容前,通过查看书目录去快速查找对应内容,而不是一字一句地找我们感兴趣内容;就像这样,事先构建索引可以有效地加速查询速度。...空间索引定义: 依据空间实体位置和形状或空间实体之间某种空间关系,按一定顺序排列一种数据结构,其中包含空间实体概要信息,如对象标识,最小边界矩形及指向空间实体数据指针 常见空间索引技术有网格索引...,为了实现要素真正被网格分割,同时保证内要素不超过一个量而提出一种空间索引方法。...构造方法: 首先将整个数据空间分割成为四个相等矩阵,分别对应西北(NW),东北(NE),西南(SW),东南(SE)四个象限; 若每个象限内包含要素不超过给定量则停止,否则对超过矩形再按照同样方法进行划分

1.1K10

geohash之2d 地理空间索引

例如,您可能会写一个查询来查找餐馆距离酒店特定距离,或查找某个特定邻域内博物馆。 本文档介绍了如何在文档中存储位置数据以及如何创建地理空间索引。...要创建地理空间索引,请使用值为2densureIndex方法作为集合位置字段。...为了建立一个干草堆索引,使用bucketSize参数在 ensureIndex()方法,如在以下原型: db.collection.ensureIndex({ : "geoHaystack...Geohash值 要创建地理空间索引,MongoDB会计算 指定范围内坐标对geohash值,并为该点地理散列编制索引。 要计算geohash值,请连续将2D地图划分为象限。...对于具有两位分辨率地理散列,左下象限中所有点将具有00地理散列。左上象限将具有01geohash 。右下角和右上角分别为10 和11。 为了提供更高精度,继续将每个象限划分为子象限。

2.2K40

Spring认证中国教育管理中心-Spring Data MongoDB教程四

Criteria 类还为地理空间查询提供了以下方法(请参阅GeoSpatial Queries部分以查看它们实际效果): Criteria 内 (Circle circle)创建使用地理空间标准$geoWithin...以下查询方法可让您查找一个或多个文档: findAll:T从集合中查询类型对象列表。 findOne:将集合上即席查询结果映射到指定类型对象单个实例。...如果类型无法转换为所需目标类型,则此方法将抛出DataAccessException. 11.6.4.地理空间查询 MongoDB支持通过使用等运营商地理空间查询$near,$within,geoWithin...Criteria类中提供了特定于地理空间查询方法。还有一些形状类(Box、Circle和Point)与地理空间相关Criteria方法结合使用。...Criteria.where("location").near(point).minDistance(0.01).maxDistance(100)), Venue.class); 要Point使用球坐标查找附近场地

2.8K20

IM里“附近的人”功能实现原理是什么?如何高效率地实现它?

本文引用了饿了么资深开发工程师万汨“Redis 到底是怎么实现“附近的人”这个功能呢?”一文内容,感谢原作者分享,为了提升文章品质,即时通讯收录时有内容补充和修订。...1、引言 基本上以陌生人社交为主IM产品里,都会增加“附近的人”、“附近xxx”这种以LBS(地理位置)为导向产品特色(微信这个熟人社交产品里为啥也有“附近的人”?...5、Redis里GEO地理位置相关指令,就能很好上述问题 针对“附近的人”这一位置服务领域应用场景,服务端高性能场景下,常见可使用PG、MySQL和MongoDB等多种DB空间索引进行实现。...而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高运行效率。 要提供完整附近的人”这样功能或服务,最基本是要实现“增”、“删”、“查”功能。...不过本质上,GEORADIUSBYMEMBER = GEOPOS + GEORADIUS,即先查找用户位置再通过该位置搜索附近满足位置相互距离条件其他用户对象

1.8K00

C++【哈希表模拟实现】

,映射 至表中对应位置,实现存储,利用空间换时间,哈希表查找效率非常高,可以达到 O(1),哈希表实现主要分为两种:闭散列 与 开散列,本文中将利用这两种方案实现哈希表 ---- ️正文 1、模拟实现哈希表...EXIST 插入数据后状态 删除 DELETE 删除数据后状态 其实简单分为 [可用 / 不可用] 两种状态也行,细分出 EMPTY 与 DELETE 是为了在进行 探测 时,提高效率 探测...新表,将 原表 中数据映射至 新表 中,映射完成后,交换 新表 和 原表,目的是为了更新当前哈希表对象 表 关于 平衡因子 控制 根据别人试验结果,哈希表中存储有效数据量超过哈希表容器...因为在闭散列中,表中存储数据不涉及自定义类型动态内存管理,并且 vector 在对象调用默认析构时,会被调用其析构,释放其中内存 2.3、查找 哈希查找时,只需要先定位至具体位置,然后遍历其中...cout << ht.MaxBucketSize() << endl; } 插入约 100w 数据,哈希 最大高度不过为 2 因此,哈希可以做到常数级别的查找速度,并且不存在 踩踏 问题 其实库中

21910

一文讲懂HashMap

HashMap 插入、查找、删除操作HashMap 插入操作分为两个步骤:计算哈希值和插入键值对。计算哈希值目的是确定键值对在哈希表中存储位置,这一步可以通过哈希函数来完成。...插入键值对过程分为两种情况: 当哈希值对应位置为空时,直接将键值对插入到该位置。 当哈希值对应位置不为空时,需要遍历链表或红黑树,查找是否存在相同键值对。...空间需求:HashMap 空间需求与键值对数量有关,而 TreeMap 空间需求与二叉树高度有关。...当两个对象hashCode相同会发生什么? 当两个不同对象hashCode相同时,会产生哈希冲突。这意味着这两个对象在HashMap中可能会被分配到相同索引位置上。...为了解决在哈希冲突严重时,链表长度过长导致性能下降问题,将链表转换为红黑树,提高了查找效率。 对哈希算法优化。

49530

Java中HashMap和HashTable到底哪不同?

这并不是因为HashTable有什么特殊实现层面的原因导致不能支持null键和null值,这仅仅是因为HashMap在实现时对null做了特殊处理,将nullhashCode值定为了0,从而将其存放在哈希表第...,表示当前Entry对象在链表尾部 可以说,有多少个键值对,就有多少个Entry对象,那么在HashMap和HashTable中是怎么存储这些Entry对象,以方便我们快速查找和修改呢?...所以,事实就是HashMap为了加快hash速度,将哈希表大小固定为了2幂。当然这引入了哈希分布不均匀问题,所以HashMap为解决这问题,又对hash算法做了一些改动。...具体我们来看看,在获取了key对象hashCode之后,HashTable和HashMap分别是怎样将他们hash到确定哈希(Entry数组位置)中。 ? ?...因为这是两个类相同一点。事实上,这个优化在JDK 1.8中已经去掉了,因为JDK 1.8中,映射到同一个哈希(数组位置)Entry对象,使用了红黑树来存储,从而大大加速了其查找效率。 5.

63520

如何实现基于商圈和地标的位置搜索

商圈是一个地理范围,但并不是官方划分,而是民间大致划分,它通常提供了民众消费、娱乐功能,产生了一个相对集中活动区域,比如王府井、五棵松。...比如我打算去王府井溜达,提前订好吃饭地方,就可以搜王府井附近有什么饭店,再比如我晚上去工人体育场看演唱会,提前订好住地方,就可以搜索工人体育场附近有什么酒店。极大丰富了应用中搜索场景。...商圈如何划定 地标不存在划定问题,商圈划定方式大体可以分为三类,多边形、矩形、圆形。 多边形 根据实际商圈范围,划定边界,形成一个不规则形状。它边界是由多个坐标点连线组成。 ?...这样划分商圈会非常精确,就像官方地理区域划分一样。...地标搜索POI 地标本身也是POI,它有一个坐标,这个问题就变成了“给定一个坐标,如何搜索附近POI”,也参照“如何实现按距离排序、范围查找”这篇文章。

2.1K00

Thanos架构剖析

为了解决Prometheus缺少多集群监控全局视图,以及对历史数据存储问题,Improbable开源了他们Prometheus高可用解决方法Thanos,Thanos与Prometheus无缝集成...通常,对象存储中存储每个TSDB块平均需要6MB本地磁盘空间,但是对于带有大标签集高基数块,它甚至可以增加到30MB甚至更多。...Thanos Store Gateway支持索引缓存,以加快从TSDB块索引进行发布和系列查找速度。支持两种类型缓存:in-memory(默认)和memcached。...网络:Compator是对对象存储使用网络最多组件,因此最好将其放在存储区域附近。他必须要下载压缩/降准采样所需要每个块,并在每次执行上传压缩/降准采样完成块。还会经常刷新存储状态。...磁盘:Compator需要本地磁盘空间来存储中间数据以进行处理,以及对存储桶状态缓存。通常,对于中型存储,随着压缩时间范围随着时间增长,大约100GB应该足以继续工作。

2.9K11

jvm学习笔记

这些本地方法利用就是本地方法栈 堆 线程共享,需要考虑线程安全问题 new创建对象都是存放在堆 有垃圾回收机制 堆内存溢出 不断生成新对象,并且所有对象一直在使用,就会导致堆内存溢出 修改堆空间大小...-verbose:gc : 若存在垃圾回收,则进行打印信息 -XX: StringTableSize=200000 : 因为串池结构是数组加链表这种方式,数组中一个关键字称为一个,这里就是设计数量...,数量越大性能越好,但相对占用空间就可能过大,造成资源浪费 StringTable性能调优 可以适当调大STringTable数组长度也就是数量,可以减少冲突从而使得查找效率得到提升 使用串池可对系统性能进行调优...这里我个人理解就是判断这些软引用有没有引用其他对象,如果没有,则将其在队列中删除,从而将队列对软引用对象强引用解除掉,从而实现对象回收 /** * 关联了软引用队列,软引用关联对象回收时...,在新对象分配地址时,会在队列中进行查找,判断有无空间,在进行分配 优点 清除速度快 缺点 会产生大量碎片空间,导致总剩余空间虽然足够,但有些大空间对象仍无法分配到足够内存,导致内存溢出 标记整理

15710

Google Earth Engine(GEE)——使用 GeoPandas 和 Uber H3 空间索引进行快速多边形点分析

空间索引方法有助于加速空间查询。大多数 GIS 软件和数据库都提供了一种机制来计算和使用数据图层空间索引。...如果您使用 Python 进行地理处理,GeoPandas 库还提供了使用 .sidex 属性基于 R-Tree 空间索引易于使用实现。...这些单元格 id 具有独特属性,例如附近单元格具有相似的 id,您可以通过截断它们长度来找到父单元格。这些属性使得诸如聚合数据、查找附近对象、测量距离之类操作非常快速。...国家地理空间情报局海事安全信息门户以反航运活动消息形式提供所有海盗事件形状文件。 数据以 zip 文件形式提供ASAM_shp.zip。...H3 特别适合这种空间聚合并且速度非常快。 这篇文章中使用代码和数据集可以在我Github 存储库中找到。您还可以在 Binder 中实时运行 Jupyter Notebook 。

21310

HashMap源码解析

Java中散列表主要是用数组和链表实现,每个列表都被称为为了提高元素检索速度,在散列表中要想查找元素在散列表中位置,必须要先计算出当前对象散列码才可以。...也就是说在散列表底层是通过当前对象散列码除以当前散列表樋数,然后剩余余数,就是当前对象在散列表中位置。例如。...如果发生这种现象时,散列表就会用当前对象对象进行比较(调用对象equals方法比较),来检查当前对象是否已经在中存在了。如果当前对象没有在中存在,则会把当前对象直接存储在起始位置。...我们知道如果要在HashMap中查找一个元素,那么首先就会计算这个keyhash code。然后我们就会得知,这个元素在数组中一个位置。...我们假设要检索元素在这个第5个链表位置,这时,我们只要直接遍历这个链表就可以了,而不是向LinkedList集合那样需要遍历整个链表,所以在HashMap中查找元素和删除元素性能要比ArrayList

55510

HashMap、Hashtable、ConcurrentHashMap原理与区别

空间换时间:如果希望加快Key查找时间,还可以进一步降低加载因子,加大初始大小,以降低哈希冲突概率。...当hash表中负载因子达到指定“负载极限”时,hash表会自动成倍地增加容量(数量),并将原有的对象重新分配,放入新内,这称为rehashing。...当我们将键值对传递给put()方法时,它调用键对象hashCode()方法来计算hashcode,然后找到bucket位置来存储值对象。...当获取对象时,通过键对象equals()方法找到正确键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞时,对象将会储存在链表下一个节点中。...ConcurrentHashMap默认将hash表分为16个,诸如get、put、remove等常用操作只锁住当前需要用到

46840
领券