昨天,我花了一些时间考虑缓存。
具体来说,缓存数据。
我正在使用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
,将其转换为表名列表,循环遍历它们,从缓存的数据{{1中检查相应的表更新时间(使用表名作为键)在第一个函数中创建。
如果任何表更新时间比缓存时间更新,那么它将进入数据库并获取新数据,否则返回缓存数据。
同样,如果缓存中没有Dictionary
个表,则返回缓存数据,因为假设没有进行任何更改,因为只有在对数据库进行更改时才会创建此缓存对象。 / p>
数据始终保持在滑动缓存时间,通常非常短,当然,根本不需要缓存的数据可以直接获取而无需此过程。
我没有公布上述任何一项的代码,因为它与我的实际问题不一定相关,但背景很重要。
所以,我的实际问题是:
鉴于上述工作正常可以确定我的数据库中的任何表何时发生了变化(在phpMyAdmin中没有任何更改,但由于只有一个人可以访问它,在我的情况下这很好......我怎么能申请缓存用户控件或页面的原理相同吗?
因此,我过去使用Dictionary
和VaryByParam="PARA"
成功缓存了用户控件。按理说VaryByCustom="CUSTOM_VALUE"
是要走的路......但是我如何可靠地将参数(表名和页面的最后缓存时间)传递给自定义函数来执行此操作...或者,我是胡说八道?!
此外,有没有办法获得缓存写入时间而无需为每个缓存项目保存额外的VaryByCustom
密钥?