大容量KV应用场景低延迟查询的方案

liuxins_udi 发布于 2016/10/14 17:17
阅读 243
收藏 1

看了网上面试题目设计题:约10亿qq用户,每个用户可以设定100字符以内的个人签名,请设计一个服务器如何高效支持用户对签名的查询,平均每秒有1000个用户请求这是网上流传的腾讯公司的面试题目设计题:约10亿qq用户,每个用户可以设定100字符以内的个人签名,请设计一个服务器如何高效支持用户对签名的查询,平均每秒有1000个用户请求

我想如果通过KV的方式,
1.假如kv记录很多,假如全部加载到内存1T多的话,怎么来保存KEY?
2.怎么尽可能把所有的KEY 加载入内存,从而达到获取较高的命中?
3.另外如果KEY长短不一容易造成内存碎片,怎么让KEY尽量长短一致?
4.一般还要求查询在延迟很低,怎么快速找到对应的KEY?
当然我看你说的 只需要通过Key找到数据结构的起始点  可能说的是 把key的个数减少,
能否请详细讲解下整个方案的落地过程

加载中
0
回去干活
回去干活

首先要确定的是所谓的每秒有1000个用户应该是指修改或是查询吧?也就是这里没有全文索引的需求.

从最简洁的情况来看struct应该就是

type User struct{
	UserId uint64
	Remark string
}
//很明显 string 类型是char*,碰到\0就结束,那就这个struct就是变长的.
//这里用golang来描述,很久不写C,语法都忘了.

当然这里肯定是要利用User.UserId来做一致性哈希分布开来.

然后用另一个map来记录数据结构存储在硬盘上的记录

type UserId uint


type Index struct{
 Offset uint8
 Ip	uint
 UserId UserId
}


type Kv map<UserId,Index>



这里map就是一个hash算法了,相关实现很多,golang直接内置了.

通过这里的Map已经很容易定位了.

后面就是修改签名了,这里可以学习mongodb的方式,当修改后看看当前文件的开始位置和结束位置是否能存下修改后的struct,如果不够存的话就放在文件尾部,同时事务更新Kv这个数据结构 .(当然这个文件可能会留下很多"缝隙",需要在夜间不忙的时候做磁盘整理,更新Index.Offset)

还有就是并发的问题,这个直接队列处理就好了,如果 排队太多的话,就一致性分片分多些.

当然这只是最基础的一个情况,还有很多优化要做,不过够多了就成了一个nosql了.



liuxins_udi
liuxins_udi
感谢解惑
0
kakai
kakai
这个比较高端,其实我个人觉得用内存KV很难做到10亿的数据存储,10亿的数据量单数据库应该比较难。我觉得解决方案还是在分布式+集群上下手
返回顶部
顶部