2

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

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”是一个存储过程,它只是一个选择。

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

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

4

1 回答 1

2

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

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

编辑

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

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

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

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

到底什么是“最新的”?

在 Web 应用程序中,用户可能看到的最新信息是上次响应中提供的信息。这里有一些要考虑的事情。

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

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

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

于 2009-09-29T15:49:27.780 回答