Web applications 何时使用键值存储进行web开发?

Web applications 何时使用键值存储进行web开发?,web-applications,memcached,redis,web-hosting,Web Applications,Memcached,Redis,Web Hosting,什么时候会有人使用键值(Redis、memcache等)存储进行web开发?一个实际的用例将是最有帮助的 我感到困惑的是,一个简单的数据库似乎更具功能性,因为据我所知,它可以做键值存储所能做的一切,还允许您进行过滤/查询。意思是,据我理解,你不能像这样做: select * homes where price > 100000 使用键值存储 例子 让我们假设StackOverflow使用键值存储(memcache、redis等) 键值存储如何有助于满足Stackoverflow托管需求?

什么时候会有人使用键值(Redis、memcache等)存储进行web开发?一个实际的用例将是最有帮助的

我感到困惑的是,一个简单的数据库似乎更具功能性,因为据我所知,它可以做键值存储所能做的一切,还允许您进行过滤/查询。意思是,据我理解,你不能像这样做:

select * homes where price > 100000
使用键值存储

例子 让我们假设StackOverflow使用键值存储(memcache、redis等)


键值存储如何有助于满足Stackoverflow托管需求?

键值存储通常速度非常快,因此最好将其用作数据缓存,以存储大量访问且很少更新的数据,从而减少DBs上的负载

正如您所说的,您通常受限于查询(尽管处理得很好),但键值存储主要用于访问精确的数据:用户X的配置文件、会话X的信息等

一个“传统”的数据库对于一般的网站来说可能已经足够了,但是如果你经历了高负载,那么键值存储确实可以帮助你提高负载时间

编辑:我说的“高负荷”,是指真正的高负荷。键值存储很少是必需的


不要将NoSQL类型的数据库与memcached之类的数据库混淆(memcached不打算永久存储数据)

memcached的典型用途是存储一些可由web服务器集群访问的查询结果,即共享缓存。在这个页面上有一个相关帖子的列表,数据库可能需要做一些工作来生成这个列表。如果您在每次有人加载页面时都这样做,那么您将为数据库创建大量工作。相反,第一次检索到的结果可以存储在memcached服务器上,密钥是页面ID。集群中的任何web服务器都可以非常快速地获取该信息,而无需不断地访问数据库。一段时间后,memcached将清除缓存项,以便旧项目的结果不会占用空间。[免责声明:我不知道StackOverflow在现实中是否会这样做]


另一方面,“NoSQL”数据库用于永久存储信息。如果您的数据模式非常简单,查询也非常简单,那么它可能比标准SQL数据库快。许多web应用程序不需要非常复杂的数据库,因此NoSQL数据库非常适合使用。

这只是对bstrawson答案的补充, “mem-cache-d”是一种缓存机制,而Redis是一种永久存储,但两者都将数据存储为键值对

搜索键值存储(如Redis或Membase)更像是搜索关系数据库中的所有值,速度太慢。如果您想要执行一些查询,您可能需要移动到面向文档的NoSQL类型数据库,例如MongoDB或CouchDB,您可以执行一些查询部分


在不久的将来,您将能够处理couchbase sever 2.0,它将通过新引入的NoSQL数据查询和缓存(直接从memcached源代码派生)解决您所有棘手的问题

  • 快速应用开发
  • 大规模可扩展系统
  • 事实上,大多数noSQL解决方案实际上是无模式的;操作所需的仪式要少得多;重量轻(就原料药而言);与更规范的关系持久性系统相比,它提供了显著的性能提升,这表明它们适合上述两种用例(一般意义上)

    玩世不恭——或者从商业意义上讲可能是实际的——可以为noSQL系统提出第三个通用用例(仍然由上述一组特征/特性提供信息):

    它更容易摸索,任何没有经验(但没有脑死亡)的疯狂极客都可以很快学会。这是一个非常强大的功能。(用Oracle试试看)

    因此,noSQL系统的用例——通常可以被描述为放松的持久性系统——都以实际考虑为最佳依据


    毫无疑问,除了可大规模扩展的系统之外,RDBMS系统是正式的完美系统,旨在确保数据完整性。

    堆栈溢出确实广泛使用了Redis。您的问题的详细答案,以堆栈溢出为例,由@markgravel提供。Mark是卓越的完全异步.NET Redis绑定库的作者。

    我无法回答何时使用键值(此处为kv)数据存储的问题,但我可以向您展示一些示例,并回答您的stackoverflow示例

    使用数据库访问,您需要的大部分是kv存储。例如,用户使用用户名“joe”登录。所以,在数据库中查找“user:joe”并检索他的密码(当然是散列)。或者你把他的密码放在“user:pass:joe”下面,这真的没关系。如果是堆栈溢出,而您正在呈现页面
    http://stackoverflow.com/questions/6935566/when-to-use-a-key-value-store-for-web-development
    ,您可以查找“问题:6935566”并使用它。很容易看出kv stores如何解决您的大多数问题

    我想说,kv存储是传统RDMS提供的功能的子集。这是因为传统RDM的设计提供了许多扩展问题,并且在扩展时通常会丢失特性。kv商店没有这些功能,所以它们不会限制你。然而,这些特性通常可以以任何方式创建,从核心设计为可伸缩的(因为如果它们不可伸缩,它会立即变得显而易见)

    然而,这并不意味着有些事情你不能做。例如,您提到查询。这是许多kv存储的一个陷阱,因为它们通常不知道价值(例如,redis和
    house:0 -> {"color":"blue","sold":false,"city":"Stackoverville","price":500000}
    house:1 -> {"color":"red","sold":true,"city":"Toronto","price":150000}
    house:2 -> {"color":"beige","sold":false,"city":"Toronto","price":40000}
    house:3 -> {"color":"blue","sold":false,"city":"The Blogosphere","price":110000}
    
    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
    
    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         -> ""