Memcached / Microsoft Velocity性能问题

时间:2009-11-19 18:24:17

标签: c# sql memcached appfabric

关于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是在其自己的缓存对象中保存所有客户订单的序列化列表。减少往返次数,但看起来很蹩脚。

有人可以了解这种情况吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

选项1:使用区域

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

选项2:使用区域和标签

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

这两个选项附带一些警告,所以请务必阅读文档: Velocity Tag BasedMethods