Web applications 何时使用键值存储进行web开发?
什么时候会有人使用键值(Redis、memcache等)存储进行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托管需求?
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源代码派生)解决您所有棘手的问题
毫无疑问,除了可大规模扩展的系统之外,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 -> ""