Memcached/Microsoft Velocity 性能问题

Posted

技术标签:

【中文标题】Memcached/Microsoft Velocity 性能问题【英文标题】:Memcached/Microsoft Velocity Performance Question 【发布时间】:2009-11-19 18:24:17 【问题描述】:

只是一个关于 Microsoft Velocity 的随机查询。

场景: 假设我想要数据库中的所有订单。在 SQL 中,这很好,我可以做到 SELECT OrderId,TotalCost... from Orders。这是我数据库的一次往返,每个人都很高兴。

现在,如果我正在使用 Memcached 或(正如我现在使用的)Microsoft Velocity (CTP3),那么没有简单的方法可以做到这一点。我看到的两个选项是(在伪代码中)

FOR EACH ORDER
     Order = cache.TryGet(OrderId)
     if Order is null
            Order = db.Get(OrderId)
END FOR EACH

这将是往返的负载。

另外,考虑一下我想获得客户的订单

SQL:Select OrderId....TotalCost from Orders where CustomerId = MyCustomerId

来回一趟,大家开心。

使用缓存解决方案,我确实看到了两种解决方案:

解决方案 1:

DOES CustomerOrderIdsForCustomerId EXIST
     NO
           POPULATE CustomerOrderIdsForCustomerId FROM DATABASE
     YES
           FOR EACH OrderId IN CustomerOrdersForCustomerId
                  cache.TryGet(OrderId)
                  IF Order IS NULL
                        Order = db.Get(OrderId)
           END FOR EACH

解决方案 2 是在它自己的缓存对象中保存所有客户订单的序列化列表。减少往返行程,但看起来很蹩脚。

有人可以解释一下这种情况吗?

【问题讨论】:

【参考方案1】:

仅仅因为你有一个缓存并不意味着你必须为每个查询使用它!在这种情况下,正如您已经确定的那样,它并没有真正帮助您,我可能会直接进入数据库进行此类事情。 不过,这有点取决于您的应用程序 - 如果您认为客户会定期查看他们的订单历史记录,或者您有一些功能可以分析订单以查看哪些产品很热门,那么您可能需要使用一些缓存来保持负载关闭您的 SQL 服务器。在这种情况下,我可能会在缓存中保存订单的数据表或订单集合,然后使用 LINQ 查询它以显示客户的订单。

【讨论】:

我同意你不应该总是使用缓存。不过,我想说的是,我持有一个订单集合(甚至将所有订单存储在他们自己的区域中),使用 LINQ 语法取回所有订单我会这样做: var x = from Orders in dc.GetOrdersInRegion ("Orders") 选择 Orders.Value;然后以这种方式遍历它们。如果我想要特定客户的订单,我会做 var x = from Orders in dc.GetOrdersInRegion("Orders") where ((Order)Orders.Value).CustomerId == customerGuid select Orders.Value;两者都将具有相同的网络流量 +1。通过一些易失性内存缓存查询所有行是没有意义的。【参考方案2】:

请记住,缓存不应该是任何数据(在您的情况下为订单)的永久存储。在这种情况下,缓存可以帮助您从数据库服务器中移除一些负载,但是必须先在缓存中加载订单,然后才能检索它们。话虽如此,如果您使用避免遍历集合的速度,这里有几个选项需要考虑。但是,您总是必须想办法处理不在缓存中的数据。

选项 1:使用区域

您可以创建一个区域并通过一次调用从该区域获取所有对象。在您的场景中,您可以创建一个 Orders 区域,您可以在其中存储所有订单,然后使用 GetObjectsInRegion 方法获取缓存中的所有订单。但是请注意,这会带回缓存中的所有订单......这可能会或可能不会拥有您在数据库中拥有的所有订单。

选项 2:使用区域和标签

Velocity 允许您标记放置在缓存区域中的对象,然后使用这些标记检索它们。因此,在您的场景中,您可以使用“订单”标签标记订单对象,然后使用 GetObjectsByTag 方法检索它们。由于您可以使用多个标签,因此您也可以使用他们的客户 ID 标签标记它们,然后将它们拉出来。

这 2 个选项带有一些注意事项,因此请务必阅读文档: Velocity Tag BasedMethods

【讨论】:

以上是关于Memcached/Microsoft Velocity 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

数据挖掘概念

ae特效里cannon是啥意思

程序员分前端与后端,那么后端程序员都做些什么?看完就知道了