2010-08-01 42 views
2

我在问这个问题,在ASP.NET ...Memcached的社交网络应用

http://forums.asp.net/t/1584731.aspx

...但想在这里问它。我敢肯定,之前让我想通为什么推倒重来这个问题已经解决了......

短篇小说,我建立与社交功能使用的memcached作为数据库缓存层的Web应用程序。为了简化问题,假设我们有一个基本的设置,在这里我们有一个个人表和一个friendConnection表,其中个人包含个人信息,而friendConnection有两个外键,如果他们之间有好友相互联系,使用表或SQL,但问题是相似的)

我的缓存过期的逻辑很简单:只要放一个表时,过期的所有相关的,目前存在于缓存表的SELECT语句。然而,这种逻辑在性能方面是非常糟糕的,因为人们不断地交友,缓存永远不会持续超过几秒钟。

一个更复杂的逻辑可能会使所有包含当前引用好友的选择语句过期,但是这将需要获得与friendConnection表相关的所有选择语句并检查它们是否具有相关性,这也会成为一个性能负担。

首先,我的问题是否有意义?

其次,人们通常如何解决这个问题?

回答

1

与表memcached的条目不相关联,与实体项(即行)相关联。

例如,为每个成员memcached的条目,该条目存储的该成员的好友列表。

下面是一个PHP示例。我知道你使用的是ASP.NET,因此将其视为伪代码。 :-)

<?php 
$m = new Memcached(); 
$m->append('Luke.Doolittle', '|Bill Karwin'); 
$m->append('Bill Karwin', '|Luke.Doolittle'); 

回复您的意见:

,我看到的是,有放置对象的memcached则没有广义化的问题。

没错。在关系数据库中,有建模数据的正式模式。 Normalization是一种定义良好的数据建模方法,可减少冗余并防止出现异常。最佳规范化组织是由数据本身确定的和数据之间的关系。

在非关系数据库,没有数据建模的形式化。组织非关系数据的最佳方式不是由数据决定的,它是,由您需要针对该数据运行的查询确定。通过这种方式,它与定义索引或将非规范化应用于关系数据库的过程相似。

逻辑将是每种类型的对象不同。那有意义吗?

其实,你需要针对该对象运行逻辑将是对每种类型查询的不同。这就是我们将数据冗余存储在非关系数据存储中的原因。因为我们可能希望针对相同的数据运行各种查询,这意味着我们需要以不同方式访问数据,以针对每种类型的查询进行优化。

你如何使用这种技术进行去除?

从memcached中取出整个字符串,将这些值分解到数组中,删除要移除的元素,implode新数组,并将其存回memcached。

我上面的例子很简单;它也不强制唯一性。

您可能有兴趣检出Redis,它的工作方式与memcached类似,但也支持列表和本地设置。


我会使用SQL来关系存储数据,使用规范化规则。在个案基础上使用非关系方法来提高特定高优先级查询的性能 - AFTER您已使用分析来衡量并证明实际存在瓶颈的位置(避免过早优化)。

我算以下非关系型解决方案:

  • 非规范化
  • 索引(你知道SQL标准中没有提到的索引呢?)
  • 缓存
  • NoSQL数据商店

您在工具箱中拥有的工具越多,您在响应性能时就越灵活的问题。

+0

这是一个有趣的想法。我想我看到的问题是,没有将对象放入memcached的通用模式。例如,在你的解决方案中,我没有把序列化的对象放入缓存中,我正在抛出这个可能用户ID的自定义附加列表(另外,你如何使用这种技术执行删除操作?)。但在其他情况下,我可能只是把基本对象。对于每种类型的对象,逻辑都是不同的。那有意义吗? – 2010-08-01 19:52:27

+0

回复:您的回复:评论:我相信我明白你在说什么,这是非常重要的:对于非关系型数据存储“结构”数据来支持你想运行的查询,而不是精益组织物体。感谢你的突破。出于好奇,你将如何使用SQL完成最初的任务?或者这就是为什么人们回避社交类型应用程序的关系数据存储? – 2010-08-02 00:24:14