Web应用程序 – 何时使用键值存储进行Web开发?

我有一点noob,所以我去…

有人会使用键值(Redis,memcache等)存储网页开发?一个实际的用例将是最有帮助的.

我的困惑是,一个简单的数据库看起来更加功能,因为我的理解是,它可以做一切,键值存储可以做PLUS它也允许你做过滤/查询.意思是说,根据我的理解,你不能像过滤器那样做:select * homes where price> 100000与键值存储.

更新:

让我们让这个例子更加真实.我们假装StackOverflow使用键值存储(memcache,redis等).

关键价值商店如何帮助Stackoverflow托管需求?

解决方法

我无法回答什么时候使用键值(这里是kv)数据存储的问题,但是我可以向你展示一些示例,并回答你的stackoverflow示例.

使用数据库访问,您需要的大部分是kv存储.例如,用户使用用户名“joe”登录.所以你在数据库中查找“user:joe”,并检索他的密码(当然是哈希).或者也许你的密码在“user:pass:joe”下,这没关系.如果是堆栈溢出,并且您正在渲染页面https://stackoverflow.com/questions/6935566/when-to-use-a-key-value-store-for-web-开发,您将查找“问题: 6935566“并使用它.看看kv商店如何解决你的大部分问题很简单.

我想说一个kv存储是传统RDMS提供的功能的一个子集.这是因为传统RDMS的设计提供了许多扩展问题,并且在扩展时通常会丢失功能. kv商店不附带这些功能,所以他们不限制你.然而,这些功能通常可以由核心设计来进行扩展(因为它们不会立即显现).

然而,这并不意味着你不能做的事情.例如你提到查询.这是许多kv商店的陷阱,因为他们通常不了解价值(不总是真的,例如redis等等),并且无法找到你要找的东西.更糟糕的是,他们不是很快就能做到这一点,他们只是真的快速查找关键.

这个问题的一个解决方案是按字典排序你的密钥,并允许范围查询.这本质上是“在问题:1和问题5之间给我所有的东西”.现在这个例子是相当无用的,但有很多使用范围查询.

你说你想要所有的房子超过10万美元.如果你想能够做到这一点,你将按价格创建房屋的索引.说你有以下的房子

house:0 -> {"color":"blue","sold":false,"city":"Stackoverville","price":500000}
house:1 -> {"color":"red","sold":true,"city":"Toronto","price":150000}
house:2 -> {"color":"beige","price":40000}
house:3 -> {"color":"blue","city":"The Blogosphere","price":110000}

在SQL中,您将将每个字段存储在列中,而不是将其全部存储在一个(在这种情况下为JSON)文档.并且可以SELECT * FROM房子WHERE价格>这似乎都很好,但是,如果没有建立索引,这需要查看桌子上的每一个房子,检查它的价格,如果你有几百万个房子,可能会很慢.所以有了一个kv商店,你也需要一个索引.主要的区别是,SQL数据库将默默地做一些缓慢的事情,那里的kv存储将无法进行.

如果您没有范围查询,则需要将索引粘贴到单个文档中,这样可以安全地更新它,这意味着您必须为每个查询下载整个索引,从而限制了可扩展性.

house:index:price -> [{"price":500000,"id":"0"},{"price":150000,"id":"1"},{"price":110000,"id":"3"},{"price":40000,"id":"2"}]

但是,如果您有范围查询(通常称为键盘扫描),则可以创建如下索引:

house:index:price:040000 -> 2
house:index:price:110000 -> 3
house:index:price:150000 -> 1
house:index:price:500000 -> 0

然后你可以请求房子之间的钥匙:index:price:100000和house:index:price ::(‘:’字符是’9’后的字符),你会得到[3,1,0]所有的房子比10万美元更昂贵(他们也有利于顺序).另一个很好的事情是,他们可能会在你的集群的一个“分区”,所以这个查询将需要大约相同的时间,一个单一的获取(加上微小的额外的转移开销),或两个得到,如果你的范围发生过去服务器边界(但是可以并行完成这些)!

这样就可以显示在kv商店中如何进行查询.您可以查询任何可以排序的字符串(几乎任何东西),并快速查找.如果您没有范围查询,您将需要将整个索引存储在一个可以吸收的键下,但如果您有范围查询,则它非常好,而且速度非常快.这是一个更复杂的例子.

我想要多伦多的未售出房屋不到10万美元.我只需要设计我的索引. (我添加了几个房子,使它更有意义)起初以为你可能只是为每个属性建立另一个索引,但你会很快意识到,这意味着你必须选择每个未售出的房子,并从数据库中下载它. (这就是我所说的缩放问题立即明显的意思.)解决方案是使用多索引.一旦构建,您可以准确选择所需的值.

house:index:sold:city:price:f~Fooville~000010:5        -> ""
house:index:sold:city:price:f~Toronto~040000:2         -> ""
house:index:sold:city:price:f~Toronto~140000:4         -> ""
house:index:sold:city:price:t~Stackoverville~500000:0  -> ""
house:index:sold:city:price:t~The Blogosphere~110000:3 -> ""
house:index:sold:city:price:t~Toronto~150000:1         -> ""

现在,与上一个例子不同,我把id放在了key中.这允许两个房屋具有相同的属性.我可以将它们合并在一起,但是添加删除索引变得更加困难.我也选择将我的数据与〜分开.这是因为它是所有的字母之后的字典,确保全名将被排序,我不必每个城市相同的长度.在生产系统中,我可能会使用字节255或0.

现在范围房子:指数:出售:城市:价格:f〜多伦多〜100000 – 房屋:指数:出售:城市:价格:f〜多伦多~~将选择所有匹配查询的房屋.重要的是要注意的是查询与结果数呈线性关系.这意味着您必须为要索引的每一组属性构建一个索引(尽管我们的示例中的索引也适用于已销售和市售查询).这可能看起来很多工作,但最终你意识到这只是你在做,而不是你的数据库.我相信我们将会开始看到这样的图书馆很快就会出现:D

拉伸主题一点,我已经显示:

>某些使用kv商店.
>如何在kv商店查询.

我认为,您会发现,kv存储对于许多应用程序来说已经足够了,通常可以提供比传统RDMS更好的性能和可用性.话虽如此,每个应用程序是不同的,因此,不可能回答原来的问题.

相关文章

HTML代码中要想改变字体颜色,常常需要使用CSS样式表。CSS是...
HTML代码如何让字体盖住图片呢?需要使用CSS的position属性及...
HTML代码字体设置 在HTML中,我们可以使用标签来设置网页中的...
在网页设计中,HTML代码的字体和字号选择是非常重要的一个环...
HTML(Hypertext Markup Language,超文本标记语言)是一种用...
外链是指在一个网页中添加一个指向其他网站的链接,用户可以...