0

昨天,我花了一些时间考虑缓存。

具体来说,缓存数据。

我正在使用 ASP.NET 4.0,在 VB 中编码。我使用的是 MySQL 数据库,因此不能使用仅限 SQL Server 的 sqlDependency。

对我来说重要的是,所有数据更改都会被执行并且没有用户看到旧数据,因此我必须想出一些东西来监视特定表上的数据库更改。

我想出的是这个......

1:在缓存中创建键/值字典的例程,其中包含最近写入的任何表名和写入时间时间戳,即:

tableName    |     timeStamp (Unix)
table2Name   |     timeStamp

2:写入任何数据时调用的常用函数,即所有 INSERT、UPDATE 或 DELETE 命令都是通过向该函数传递两个参数来创建的,sql并且tableChanges

在这个函数中,sql只是 UPDATE/INSERT 代码,并且tableChanges是一个逗号分隔的表名列表,这些表名将受此命令影响。

第 1 点中的表格是在任何修改期间创建的。

3:一个常用的getData函数,它接受参数:

 cacheName As String      - the cache key name
 slidingTime As Double    - sliding expiry period (converted to minutes within the function)
 dependancy As Object     - standard cache dependancy object
 newSql As String         - the query required to get this data
 Optional tableDependencies As String = "" - a comma separated list of tables which this data is dependant on

4:基于与上述类似的参数将数据对象写入缓存的函数。

现在,函数#3 首先检查缓存是否包含传递给它的键,如果没有,那么它就简单地转到数据库并获取新数据。

如果它确实包含这个键,那么它会做两件事,首先它获取添加这个项目的时间戳,它总是cacheKey_added(在添加缓存项目的过程中创建),然后得到这个时间戳,它抓取逗号分隔tableDependencies,将其转换为表名列表,循环遍历它们,从Dictionary第一个函数中创建的缓存数据中检查相应的表更新时间(使用表名作为键)。

如果任何表更新时间比缓存时间更近,则它会转到数据库并获取新数据,如果不是,则返回缓存数据。

类似地,如果缓存中没有保存任何Dictionary表,它会返回缓存数据,因为假设没有进行任何更改,因为此缓存对象仅在对数据库进行更改时创建。

数据总是保持在一个滑动的缓存时间上,通常很短,当然完全不需要缓存的数据可以直接抓取,不需要这个过程。

我没有发布上述任何内容的代码,因为它不一定与我的实际问题相关,但背景很重要。

所以,我的实际问题是:

鉴于上述方法可以很好地确定我的数据库中的任何表何时发生更改(假设 phpMyAdmin 中没有任何更改,但由于只有一个人可以访问它,在我的情况下这很好......我如何应用相同的原则缓存用户控件或页面?

因此,我过去曾使用 VaryByParam="PARA"VaryByCustom="CUSTOM_VALUE"成功缓存过用户控件。按理说这VaryByCustom是要走的路……但是我如何可靠地将参数(表名和页面的最后缓存时间)传递给自定义函数来执行此操作……或者,我是在胡说八道吗?!

此外,有没有办法获得缓存写入时间而不必为每个缓存项保存额外的_added键?

4

0 回答 0