昨天,我花了一些时间考虑缓存。
具体来说,缓存数据。
我正在使用 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
键?