我在ASP.NET上问过这个问题......
http://forums.asp.net/t/1584731.aspx
......但也想在这里问一下。我确信这个问题已经解决了,所以我想到了为什么要重新发明轮子......
简短的故事,我正在构建一个具有社交功能的Web应用程序,使用memcached作为数据库的缓存层。为了简化问题,让我们假设一个基本设置,其中我们有一个人员表和一个friendConnection表,其中人员包含个人信息,而且如果朋友彼此互相交流,那么有两个外键将一个人链接到另一个人(我实际上并不是这样)使用表或SQL,但问题类似)
我的缓存过期逻辑很简单:无论何时发生放入表,都会使与缓存中当前存在的该表相关的所有select语句失效。然而,这种逻辑在性能方面是非常糟糕的,因为随着人们互相交流,缓存永远不会持续超过几秒钟。
例如,更复杂的逻辑可能会使包含当前引用的朋友的所有select语句失效,但这需要获取与friendConnection表相关的所有select语句,并检查它们的相关性,这也是性能负担。首先,我的问题是否有意义?
其次,人们通常如何解决这个问题?
答案 0 :(得分: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中获取整个字符串,将值分解为数组,删除要删除的元素,内插新数组,然后将其存储回memcached。
我上面的例子非常简单;它也不会强制实现唯一性。
您可能有兴趣查看Redis,它的作用类似于memcached,但也支持列表和本地设置。
我会使用SQL来关联存储数据,使用规范化规则。根据具体情况使用非关系方法来提高特定高优先级查询的性能 - AFTER 您已使用性能分析来衡量和证明瓶颈实际存在的位置(避免过早优化) 。
我将以下内容视为非关系解决方案:
工具箱中的工具越多,响应性能问题的灵活性就越高。