非常简单的缓存 - 这是一个o.k.技术?

时间:2009-04-07 11:28:19

标签: asp.net caching

我正在使用以下技术来缓存对我的数据库的一些调用 - 这个函数存在于我的存储库中。

Public Shared Function GetByStoreURL(ByVal StoreURL As String) As Model.Partner

        Dim key As String = StoreURL
        If Current.Cache(key) Is Nothing Then
            Dim objPartner = Model.DB.Select().From(Tables.Partner).Where(Partner.Columns.StoreURL).IsEqualTo(StoreURL.ToString).And(Partner.Columns.IsDeleted).IsNotEqualTo(1).ExecuteSingle(Of Partner)()
            Current.Cache.Add(key, objPartner, Nothing, Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(60), CacheItemPriority.NotRemovable, Nothing)
        End If

        Return DirectCast(Current.Cache(key), Model.Partner)

    End Function

这种技术有缺陷吗?看起来很简单,看起来效果很好。

3 个答案:

答案 0 :(得分:3)

唯一的问题是,如果要使缓存无效(由于数据更改),并且您正在负载均衡/群集环境中运行。如果这是一个可能性,那么您可以添加文件依赖项,或查看像Velocity这样的分布式缓存系统。

如果您不需要这样做,则不要向外扩展,并且您不介意有可能“陈旧”的记录,那么这很好: - )

答案 1 :(得分:1)

实际上,这里有很多错误,最明显的是违反了Single responsibility principle。基本上,您的函数应该只执行一个严格定义的任务(即从数据库中检索Partner)。

接下来是多线程。网站本质上是多线程的,因此应该考虑到这一点。更具体地说,可以在对If Current.Cache(key) Is NothingReturn DirectCast(Current.Cache(key), Model.Partner)的调用之间从缓存中删除项目。解锁此问题需要锁定,但这会使功能更加膨胀(参见第一段)。

此外,可以在执行数据库代码时将项目添加到缓存中。这将导致错误,因为Cache.Add不会使用相同的键覆盖值,这些键已经存在(想想多线程)。

最后我质疑StoreURL的唯一性。

答案 2 :(得分:0)

此技术称为lazy initialization。是的,它被广泛使用。