我希望用户可以从任何设备查看和搜索他们在我的网站上访问过的页面的标题。
考虑到以下要求,哪种 NoSQL 可以完成这项工作并让用户满意?
数据大小:30 亿行(600 万用户,保留 500 个标题/用户的历史记录)。 〜1.5TB。
行/文档结构:[ userId(GUID)、pageId(GUID)、viewedTime、pageTitle(最多 160 个字符)]
写入(预期写入速率:2,000 个查看页面/秒):
当用户查看页面时,将创建一个新行,除非用户之前查看过该页面,并且我将只更新现有行的viewedTime。
查询(预期查询速率:300/秒):
1.通过userId检索最近100-500个标题(使用String.indexOf()扫描关键字)。
2. 通过 userId 和 pageID 检索行。
3. 清理 - 批处理作业,通过删除较旧的内容将每个用户 ID 的标题减少到 500 个。
注释:
- 对于包含缓存层的商店感到高兴。
- 我可以接受偶尔的数据丢失。并且最终一致性很好。
- 数据量可能会增长 10 倍,因此我需要能够扩展(因此是水平可扩展性?)
- 有数百万个不同的页面,因此为了避免连接,我认为将标题保留在每一行中。
最佳答案
我想你可以选择 Cassandra。它是写优化的,在执行读操作时,您可以指定数据的最新程度。如果您采用最低一致性配置进行读取,它也会表现得很好。否则 cassandra 的读取速度相当慢。
关于sharding - 对于以写入为主的 30 亿行,使用什么 NoSQL 数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23984956/