具有相似数据值的不同散列表cacheItem或每个数据值的单独cacheItems - 这是一种有效的方法吗?

时间:2011-05-28 16:06:59

标签: asp.net data-caching

基于数据大小,我有两种不同类别的数据缓存要求: 1)非常小的数据(2-30个字符) - 这包括诸如给定entityId的类型代码之类的东西。该系统基于父子实体层次结构的概念,并且针对与实体类型代码组合构建的值授权动作。为不同的实体缓存这些类型代码可节省db fetch的时间。 2)中/大数据 - 这是产品描述和页面等一般数据。

我很困惑哪种方法更适合第一类数据。 我可以像这样缓存它:

HttpRuntime.Cache.Insert("typeCode" + entityId, entityTypeCode);

或者像这样:

Dictionary<int, string> etCodes = 
    (Dictionary<int, string>)HttpRuntime.Cache["typeCode"];
etCodes[entityId] = entityTypeCode;

显然,在第二种方法中,我正在为每个entityId保存不必要的缓存项。 或者,让Cache对象填充了这么小的几个项目是可以的。

这些方法中的哪一种在性能和开销方面都很好?

1 个答案:

答案 0 :(得分:0)

就个人而言,我会采用第二种方法处理单个对象并使用自定义对象而不是Dictionary

这将使我能够稍后控制更多方面,例如对象内的项目到期或更改实现。

我会这样做:

public class MyCacheObject
{
    public static MyCacheObject 
    {
        get
        {   
            // ...Omitted locking here for simplification...

            var o = HttpRuntime.Cache["MyCacheObject] as MyCacheObject;
            if ( o = null )
            {
                o = new MyCacheObject();
                HttpRuntime.Cache["MyCacheObject] = o;
            }
            return o;
        }
    }

    public object GetEntity( string id, string code )
    {
        // ...
    }

    public void SetEntity( object entity, string id, string code )
    {
        // ...
    }

    // ...
}

如果您拥有实体的客户基类,则可以进一步优化GetEntitySetEntity方法。