разные хеш-таблицы cacheItem с одинаковыми значениями данных или отдельные cacheItems для каждого значения данных - какой эффективный подход? - PullRequest
0 голосов
/ 28 мая 2011

У меня есть два различных класса требований к кешированию данных в зависимости от размера данных: 1) очень маленькие данные (2-30 символов) - это включает в себя такие вещи, как код типа для данного entityId.Система основана на концепции иерархии родительских и дочерних объектов, и действия разрешаются для значений, которые строятся в сочетании с кодом типа объекта.Кэширование этих кодов типов для разных сущностей экономит время при извлечении из базы данных.2) средние / большие данные - это общие данные, такие как описание продуктов и страницы.

Я не понимаю, какой подход лучше подходит для данных первого класса.Я могу кешировать это так:

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

или вот так:

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

Понятно, что во втором подходе я экономлю на ненужных элементах кэша для каждого entityId.или, если объект Cache заполнен несколькими элементами такого маленького размера, это нормально.

Какой из этих подходов хорош с точки зрения производительности и накладных расходов?

1 Ответ

0 голосов
/ 28 мая 2011

Лично я бы использовал ваш второй подход к одному объекту и использовал бы пользовательский объект вместо 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 )
    {
        // ...
    }

    // ...
}

Если у вас есть базовый класс обычного для сущностей, методы GetEntity и SetEntity могут быть дополнительно оптимизированы.

...