大容量KV应用场景低延迟查询的方案? 400 报错
看了网上面试题目设计题:约10亿qq用户,每个用户可以设定100字符以内的个人签名,请设计一个服务器如何高效支持用户对签名的查询,平均每秒有1000个用户请求这是网上流传的腾讯公司的面试题目设计题:约10亿qq用户,每个用户可以设定100字符以内的个人签名,请设计一个服务器如何高效支持用户对签名的查询,平均每秒有1000个用户请求
我想如果通过KV的方式,
1.假如kv记录很多,假如全部加载到内存1T多的话,怎么来保存KEY?
2.怎么尽可能把所有的KEY 加载入内存,从而达到获取较高的命中?
3.另外如果KEY长短不一容易造成内存碎片,怎么让KEY尽量长短一致?
4.一般还要求查询在延迟很低,怎么快速找到对应的KEY?
当然我看你说的 只需要通过Key找到数据结构的起始点 可能说的是 把key的个数减少,
能否请详细讲解下整个方案的落地过程
首先要确定的是所谓的每秒有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已经很容易定位了.
后面就是修改签名了,这里可以学习mongodb的方式,当修改后看看当前文件的开始位置和结束位置是否能存下修改后的struct,如果不够存的话就放在文件尾部,同时事务更新Kv这个数据结构 .(当然这个文件可能会留下很多"缝隙",需要在夜间不忙的时候做磁盘整理,更新Index.Offset)
还有就是并发的问题,这个直接队列处理就好了,如果 排队太多的话,就一致性分片分多些.
当然这只是最基础的一个情况,还有很多优化要做,不过够多了就成了一个nosql了.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。