nosql – 任何人都可以解释Project Voldermort或类似的键值存储有用的场景吗?

我可以看到自己使用 Project Voldermort来缓存传统RDBMS查询的结果.但在这种情况下,它提供的优势几乎没有其他(Java)缓存系统,如EHcache Jcache等.

我还能在哪里使用Project Voldermort或类似的Key Value商店?您是如何在业务应用程序中使用它的?

解决方法

提高数据库速度的一种方法是非规范化.以MySQL为例:

CREATE TABLE `users` (
    `user_id` INT NOT NULL AUTO_INCREMENT,… -- Additional user data
    PRIMARY KEY (`user_id`)
);


CREATE TABLE `roles` (
    `role_id` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(64),PRIMARY KEY (`role_id`)
);


CREATE TABLE `users_roles` (
    `user_id` INT NOT NULL,`role_id` INT NOT NULL,PRIMARY KEY (`user_id`,`role_id`)
);

整洁,整洁,正常化.但是,如果您想获取用户及其角色,则查询很复杂:

SELECT u.*,r.*
  FROM `users` u
  LEFT JOIN `user_roles` ur ON u.`user_id` = ur.`user_id`
  JOIN `roles` r ON ur.`role_id` = r.`role_id`;

如果你对它进行非规范化,它可能看起来像:

CREATE TABLE `users` (
    `user_id` INT NOT NULL AUTO_INCREMENT,`role` VARCHAR(64),… -- Additional user data
    PRIMARY KEY (`user_id`)
);

等效的查询将是:

SELECT * FROM `users`;

这改善了查询的一些性能特征:

>因为您想要的结果已经在表中,所以您不必执行读取侧计算.例如如果您想查看具有给定角色的用户数,则需要GROUP BY和COUNT.如果它是非规范化的,您可以将其存储在另一个表中,该表用于保存角色和具有该角色的用户数.
>您想要的数据位于同一个位置,希望在磁盘上的相同位置.您可以执行一次到几次连续读取,而不需要许多随机搜索.

NoSQL DB针对这些情况进行了高度优化,您可以在这些情况下访问大多数静态的顺序数据集.那时,它只是将字节从磁盘移动到网络.减少工作量,减少开销,提高速度.尽管听起来很简单,但可以对数据和应用程序进行建模,因此感觉很自然.

这种性能的折衷是写入负载,磁盘空间和一些应用程序复杂性.对数据进行非规范化意味着更多的副本,这意味着更多的磁盘空间和写入负载.实际上,每个查询都有一个数据集.因为您将这些计算的负担转移到写入时间而不是读取时间,所以您确实需要某种异步机制来实现这一点,因此一些应用程序的复杂性.

而且因为你必须存储更多的副本,你必须执行更多的写入.这就是为什么你不能用SQL数据库实际复制这种架构的原因 – 扩展写入非常困难.

根据我的经验,这种权衡对于大规模应用来说是非常值得的.如果您想在几个月前阅读更多关于Cassandra,I wrote this piece的实际应用,您可能会发现它有用.

相关文章

文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的...
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒...
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb...
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn...
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无...