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

У меня есть два различных класса требований к кешированию данных в зависимости от размера данных: 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 ответ

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

Другие вопросы по тегам