使用户控件或页面缓存对缓存的字典的内容有所不同

时间:2013-01-29 16:24:33

标签: caching user-controls outputcache cache-control data-caching

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

具体来说,缓存数据。

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

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

我想出的是......

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

tableName    |     timeStamp (Unix)
table2Name   |     timeStamp

2:在编写任何数据时调用的常用函数,即所有INSERT,UPDATE或DELETE命令都是通过将两个参数传递给此函数sqltableChanges来创建的。

在此函数中,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,将其转换为表名列表,循环遍历它们,从缓存的数据{{1中检查相应的表更新时间(使用表名作为键)在第一个函数中创建。

如果任何表更新时间比缓存时间更新,那么它将进入数据库并获取新数据,否则返回缓存数据。

同样,如果缓存中没有Dictionary个表,则返回缓存数据,因为假设没有进行任何更改,因为只有在对数据库进行更改时才会创建此缓存对象。 / p>

数据始终保持在滑动缓存时间,通常非常短,当然,根本不需要缓存的数据可以直接获取而无需此过程。

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

所以,我的实际问题是:

鉴于上述工作正常可以确定我的数据库中的任何表何时发生了变化(在phpMyAdmin中没有任何更改,但由于只有一个人可以访问它,在我的情况下这很好......我怎么能申请缓存用户控件或页面的原理相同吗?

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

此外,有没有办法获得缓存写入时间而无需为每个缓存项目保存额外的VaryByCustom密钥?

0 个答案:

没有答案