关于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是在其自己的缓存对象中保存所有客户订单的序列化列表。减少往返次数,但看起来很蹩脚。
有人可以了解这种情况吗?
答案 0 :(得分:1)
仅仅因为你有一个缓存并不意味着你必须为每个查询使用它!在这种情况下,正如您已经确定的那样,它并没有真正帮助您,我可能会直接进入数据库进行此类事情。
这取决于您的应用程序 - 如果您认为客户经常会查看他们的订单历史记录,或者您有一些功能正在分析订单以查看哪些产品很热,那么您可能希望使用一些缓存来保持负载关闭你的SQL服务器。在这种情况下,我可能会在缓存中保留订单的DataTable或订单集合,并使用LINQ查询它以显示客户的订单。
答案 1 :(得分:0)
请记住,缓存不应该是任何数据的永久存储(在您的情况下为订单)。在这种情况下,缓存可以帮助从数据库服务器中删除一些负载,但必须先加载缓存中的订单才能检索它们。话虽如此,如果你使用的是速度来避免必须遍历集合,这里有几个选项需要考虑。但是,您始终必须找到一种方法来处理不在缓存中的数据。
选项1:使用区域
您可以通过一次调用创建一个区域并从该区域获取所有对象。在您的方案中,您可以创建一个 Orders 区域,您可以在其中存储所有订单,然后使用GetObjectsInRegion方法获取缓存中的所有订单。但请注意,这会带回缓存中的所有订单...这可能包含也可能没有您在数据库中拥有的所有订单。
选项2:使用区域和标签
Velocity允许您标记放在缓存区域中的对象,然后使用这些标记检索它们。因此,在您的方案中,您可以使用“order”标记标记订单对象,然后使用GetObjectsByTag方法检索它们。由于您可以使用多个标签,因此您还可以使用其客户ID标记对其进行标记,然后将其拉出。
这两个选项附带一些警告,所以请务必阅读文档: Velocity Tag BasedMethods