需求:
一个千万级数据量的服务,不停的插入和删除记录,每条记录需要知道自己的排名,比如SNS中的抢车位,如何让每个uid能够知道自己在所有人中的车总价排名?
致命伤(cache无用论)
有1000万个用户,试想排名第500万的用户突然发飙了,把他的车全卖了,那么他之后的500万个用户的排名都提高了,也就是cache全部瞬间失效了。。。pity,此时加再多的cache只能是浮云
解决方法:
1,划分子空间,比如k心网,不提供全部用户的排名,只提供用户在其好友中的车总价的排名(其实这样更有意义,不过这是产品层面),这样即时一个用户车价变化,影响的也只是其好友的cache,别人不做影响
2,牺牲实时性,算不过来就离线算呗,这个太容易想到了,比如k心网车总价的排名是每12个小时更新一次的
BT的需求:
假如,只是假如,我们就需要uid在所有用户中的实时准确排名怎么办??(产品不想牺牲实时性的UE),这时解决问题只能靠更好的算法模型
扩展的红黑树:
这个结构在一般数据结构书不提,在CLRS是以扩展话题为讨论的,在TAOCP中是以课后题出现,但在CLRS的视频中可是重点介绍,讲了一节课呢,所以推荐看这个视频11.Dynamic.Statistics。拷贝书上的介绍nonsense,所以只是简单的介绍一下:扩展红黑树ERBT中,每个节点不仅有color,link,key信息,还包括了一个很重要的信息=>该节点所有子节点的数目(包括其自身在内),这样每个节点的排名可以在找到它的那一霎那得到,因为(初始rank(root)=0):
rank(lnode)=rank(pnode)
rank(rnode)=children_count(lnode)+1
而作为补偿,同样需要在更改操作时,维护子节点的数目
查找和维护的时间复杂度都是log(n)
解决方案:
还是车总价的排名显示问题,我们在内存中维护这样一颗ERBT,key就是车的总价位,当有用户的车总价发生变化时,我们就删除这个节点并插入一个新节点。当需要显示用户的车总价排名时,先从uid得到车总价的数值(比如从mysql中),然后拿这个数值到ERBT中做查找,当找到这个值的时候,排名自然得到。
对于千万级数据,log(n)基本在20-30,而使mc的话,每秒请求可以到2万这个级别,我们假设hash的拉链平均长度为3,也就是使用ERBT的速度理论上是直接hash的1/10,也就是能够支撑2000r/s的请求,这样的能力对于一般的SNS应用也是够了。当然如果要求更高性能还需要做更多的优化。
故障恢复:
首先这个服务就支持分布式,因为每台机器可以独立的跑ERBT,另外即时down机了,恢复也很容易,只要从mysql中导入数据一遍则自动生成,我们也可以把ERBT定时按照hash的形式dump出一份,以备意外时访问
分享到:
相关推荐
java快速插入千万级数据,亲测91秒插入1700万数据!!!
### 实现千万级数据的分页显示 在处理大规模数据集时,如何高效地进行分页显示成为了一个关键的技术挑战。传统的分页方法在面对数百万甚至上千万的数据记录时,往往会出现性能瓶颈,导致用户体验下降。本文将详细...
本实例聚焦于“java实现csv导出千万级数据实例”,旨在提供一个高效、稳定的解决方案,避免因数据量过大而导致的性能问题,如Java中的栈溢出(Stack Overflow)。CSV(Comma Separated Values)格式因其简单、通用性...
mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据 mysql快速导入百万级千万级数据
本文将深入探讨如何使用POI和JXL框架批量导出CSV文件,处理千万级的数据,同时避免内存溢出的问题。 首先,让我们了解CSV(Comma Separated Values)文件格式。CSV是一种通用的、轻量级的文件格式,用于存储表格...
总的来说,利用SQL Server的存储过程进行千万级数据分页查询,结合合理的索引策略和优化技巧,能够有效提升查询性能,降低系统负载,为用户提供流畅的浏览体验。请参考“分页.txt”和“使用方法.txt”文件,了解更多...
现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库类型 如:(orcal,sqlServer,csv 迁移至mysql) 2.在迁移数据库时,可以只迁移指定字段. ...4.保护数据完整性,设计失败处理
经过测试,在含有14,483,461条记录的数据集中,查询第100,000页(每页10条记录)时,无论是升序还是降序,首次查询耗时仅为0.47秒,第二次查询则缩短至0.43秒。这表明该存储过程具有很高的效率。 #### 存储过程实现...
在千万级数据测试中,这些脚本可能用于模拟实际业务场景,例如,创建课程表,插入大量课程记录,然后进行各种查询操作,以此来验证ShardingJDBC的分片策略和性能。 在SQL方面,以下是一些关键知识点: 1. **索引...
在数据库管理中,面对千万级的数据量,高效地进行数据查询和分页展示是一项重要的挑战。存储过程作为数据库中的预编译代码集合,能够优化查询性能,减少网络传输,提高系统响应速度。本文将深入探讨如何设计和实现一...
本次测试的重点是分析在千万级数据下数据库的查询速度,首先得插入数据,采用 java 程序批量插入 1000 万条数据,分别插入 SQL Server 2008 和 Mysql 5.5 中。批量插入的方法就在 insert values 之后不断添加(…,…....
### Oracle千万级别数据简单操作详解 #### 一、创建表空间与分区表 在Oracle数据库中处理千万级别的数据时,合理的表空间管理和分区策略是非常重要的。以下是从给定的部分内容中提取的关键步骤: 1. **创建表空间...
在Oracle数据库管理中,处理千万级别的数据记录时,性能优化变得尤为重要。对于大规模数据集的分页查询,传统的SQL查询方式可能无法满足高效性与响应速度的要求,因此,设计并实现一个高效的存储过程来实现分页功能...
本文将深入探讨如何管理和优化存储着千万级别数据的表,以"t_order"为例,该表可能存在于您提供的压缩包文件"t_order.sql"中。 一、数据库设计与规范 在设计千万级别的数据表时,遵循数据库设计范式至关重要。"t_...
_mysql 千万级数据优化_ MySQL 是一种流行的开源关系数据库管理系统,在大规模数据处理中,MySQL 的性能优化变得非常重要。下面我们将从查询优化和 SQL 编写注意事项两个方面来讨论 MySQL 千万级数据优化。 查询...
这次拿到近亿条日志数据,千万级数据已经是关系型数据库的查询分析瓶颈,之前使用过Hadoop对大量文本进行分类,这次决定采用Python来处理数据: 硬件环境 CPU:3.5 GHz Intel Core i7 内存:32 GB HDDR 3 1600 MHz...
mssql实现千万级数据的分页显示,超级好用
在IT行业中,尤其是在数据分析、可视化或者用户界面设计的领域,处理大容量数据是一个常见的挑战。Qt是一个跨平台的C++库,提供了丰富的图形用户界面工具,包括TableWidget,用于展示和操作数据。本文将深入探讨如何...