【问题标题】:ASP.NET set cache dependency with a SqlCommandASP.NET 使用 SqlCommand 设置缓存依赖项
【发布时间】:2010-12-02 09:01:53
【问题描述】:

这是根据查询设置缓存项的有效方法吗?

HttpRuntime.Cache.Insert(
                "ListLanguages",
                 list,
                 new SqlCacheDependency(command),
                 DateTime.UtcNow.AddMinutes(AppConfiguration.CacheExpiration.MinimumActivity),
                 Cache.NoSlidingExpiration);

command 是一个 SqlCommand,之前初始化为:

SqlCommand command = new SqlCommand("Listlanguages", connection);

其中“ListLanguages”是一个存储过程,它只是一个选择。

我发现这是一种比聚合缓存依赖更简单、更防故障的方法(我的意思是防故障,因为我不必自己聚合表!:)。

更有经验的程序员是怎么想的?

【问题讨论】:

  • 我们如何知道我们是否比您更有经验? ;)

标签: asp.net caching sqlcachedependency cache-dependency


【解决方案1】:

我认为你不需要使用存储过程,命令可以直接基于其中包含的select语句。

就我个人而言,我避免使用 SqlCacheDependency,我总是担心查询中可能包含其所基于的代理系统无法处理的某些内容,并且我无法始终记住它们是什么。它在引擎盖下似乎也有点过于复杂,所以我担心它可能处于脆弱的一面。

编辑

在用户更新他们的个人资料的特定情况下,我会让更新个人资料的代码删除缓存的副本。

在更一般的意义上,我会为接收最新信息建立一个可接受的延迟,并将绝对过期设置为该延迟。

如果是昂贵的 SQL 查询,我会考虑在其他表中暂存常见摘要,并让更新此数据的代码(例如 SP)调整或删除暂存数据。

我并不是说我永远不会使用 SqlCacheDepencency,但到目前为止,我还没有遇到过这样的情况,尽管我确信它们存在,但它是唯一明智的选择。我想这种情况可能会出现在您无法完全控制所有可能修改数据库的代码的情况下。

究竟什么是“最新”?

在 Web 应用程序中,用户可能看到的最新信息是在最后一个响应中提供的信息。以下是一些需要考虑的事项。

  • 假设他们取了东西,但随后被电话打断了 5 分钟。他们是否意识到他们返回查看的数据是 5 分钟前的数据并且现在可能已经过时了?
  • 用户在提交数据前几毫秒获取了一些内容,这会改变他们所看到的内容,这有多大问题?
  • 有人正在输入一些新数据但还没有提交,是否可以说数据库中的当前数据本身已经过时了?

我要指出的一点是,无论我们在系统中投入了多少缓存聪明才智,都会不可避免地存在延迟,并且我们可以接受这种延迟而不加考虑。

考虑到这一点,在许多情况下,我们可能觉得有义务提供最新信息,但这种义务并没有真正的保证。 SO 本身就是一个很好的例子。我们在这里看到的许多查询结果实际上是缓存的,并且可能会看到与我们知道我们所做的更改不太一致的数据。然而,其他人不知道我们的更改,他们在我们制作它们的那一刻就看到它们并不重要。

【讨论】:

  • 嗯.. 我明白了,但是您如何将内容保存在缓存中并以足够的信心呈现数据以确保所呈现的数据已更新?例如,如果用户更新了他的个人资料,我相信他会因为看到它没有被改变而感到困惑:S
  • 安东尼,我很好奇你做事的方式,处理你的忧虑和顾虑..
  • 我同意 Anthony... SqlCacheDependency 使用起来很棘手。也很难知道它是否真的在做任何缓存,因为很多实际的运行时行为很难预测。
  • 你能告诉我你是如何处理这个问题的吗?您是否使用任何替代缓存或根本不使用?非常感谢您的帮助!谢谢
猜你喜欢
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2022-12-18
相关资源
最近更新 更多