有人会使用键值(Redis,memcache等)存储网页开发?一个实际的用例将是最有帮助的.
我的困惑是,一个简单的数据库看起来更加功能,因为我的理解是,它可以做一切,键值存储可以做PLUS它也允许你做过滤/查询.意思是说,根据我的理解,你不能像过滤器那样做:select * homes where price> 100000与键值存储.
更新:
让我们让这个例子更加真实.我们假装StackOverflow使用键值存储(memcache,redis等).
关键价值商店如何帮助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更好的性能和可用性.话虽如此,每个应用程序是不同的,因此,不可能回答原来的问题.