【问题标题】:Caching related data缓存相关数据
【发布时间】:2011-08-14 20:10:01
【问题描述】:

我有一些支持级联更新/删除的相关实体(用户、用户角色、用户和角色的权限)。
应用服务器经常使用它,我需要实现对它的快速访问。为此,我会将其放入应用程序缓存中。
问题是在对该数据执行级联操作时如何在数据库和缓存之间提供同步?例如,如果我删除某个角色,我还需要删除所有该角色权限,或者如果我删除一个用户,我需要删除其所有角色及其权限。
我看到了很多方法来支持缓存中的实际数据,但我也看到了一些缺点。请告诉我什么是最好的解决方案。

  1. 所有级联操作都是在数据库中使用触发器进行的。应用程序通过SqlCacheDependency 机制接收通知。问题:当服务器负载很重时怎么办?通知会延迟吗?数据库/应用程序服务器是否会花费太多成本来提供许多精确的依赖项,例如“select SomeField from DataTable where id = @x”?
  2. 所有级联操作都在应用程序的业务层进行。每个数据库更新/删除操作之后都是缓存失效操作。问题:双倍的逻辑和高网络流量(许多更新而不是一个)
  3. DB 中的级联操作,使用CacheDependency 在缓存中级联失效。问题:双重逻辑。

什么是好的解决方案? 谢谢!

【问题讨论】:

  • > 2) 所有级联操作都在应用的业务层进行>>我是说数据访问层
  • Entity Framework 是否提供了这样的功能,所以它也会自动进行级联更改?

标签: c# sql-server caching


【解决方案1】:

使用 ORM 怎么样?
我个人使用nHibernate,它带有caching 和内置级联功能,因此您甚至不必担心这一点(当然,还有许多其他功能可以让您的生活更轻松)。

否则,我绝对不会选择选项 #1 或 #3,因为它们会将应用程序逻辑引入您的存储层。
选项 #2 的巧妙实现 - 应用程序向数据库发送删除命令不应妨碍您的性能。

【讨论】:

  • 感谢您的回复。在选项 #2 中,我无论如何都需要通过网络为每个相关实体执行许多单个更新/删除。你认为这是个好主意吗?
  • 为什么是每个相关实体?如果您要删除一个角色,那么您的查询将是 delete from permissions where role_id = ...,这只是一个查询。无论如何——在你证明它是一个性能问题之前,你不应该把它当作一个问题来对待。 '过早的优化是万恶之源' c2.com/cgi/wiki?PrematureOptimization
  • 我知道了 :) 所以...我的 RolePermission 实体将同时具有 Delete 和 DeleteByRole 业务层方法,这些方法必须包含缓存条目失效。对吗?
  • 如果我做一个社交网络,我要删除用户,我也应该删除很多相关的实体,比如他的角色、群组、帖子、cmets、收藏夹、书签、友谊等。我可以在需要之前不进行优化:) 但这点对我来说仍然不干净
  • 类似的东西。另请注意,您可以在一次往返中向您的数据库发送多个删除/更新语句,因此,再次,对性能没有影响。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2011-04-13
  • 1970-01-01
  • 2011-04-22
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多