开发者社区> 问答> 正文

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

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

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

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

展开
收起
爱吃鱼的程序员 2020-06-01 10:24:42 489 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    首先要确定的是所谓的每秒有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了.



    ######感谢解惑######这个比较高端,其实我个人觉得用内存KV很难做到10亿的数据存储,10亿的数据量单数据库应该比较难。我觉得解决方案还是在分布式+集群上下手
    2020-06-01 10:24:44
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
存储分层企业数据存储类型选择与优化 立即下载
分布式KV存储Cellar演进之路 立即下载
基于etcd的超大规模生产级弹性键值存储实践与优化 立即下载