Как спроектировать / создать ключ для хранения ключа / значения? - PullRequest
0 голосов
/ 19 января 2012

Я хочу хранить сериализованные объекты (или что-то еще) в кеше ключ / значение.

Теперь я делаю что-то вроде этого:

public string getValue(int param1, string param2, etc )
{
    string key = param1+"_"+param2+"_"+etc;

    string tmp = getFromCache();
    if (tmp == null)
    {
       tmp = getFromAnotherPlace();
       addToCache( key, tmp);
    }
    return tmp;
}

Я думаю, это может быть неловко. Как я могу оформить ключ?

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Если я понял вопрос, я думаю, что самый простой и умный способ создать ключ - это использовать однонаправленную хеш-функцию, например MD5, SHA1 и т. Д. ...

Как минимум две причины сделать это:

  1. Полученный ключ уникален! (Фактически MD5 и SHA1 были взломаны (=)
  2. Полученный ключ имеет фиксированную длину!

Вы должны указать свой объект в качестве аргумента функции, и у вас есть уникальный ключ. Я не очень хорошо знаю c #, но я уверен, что вы можете найти встроенную однонаправленную хеш-функцию.

0 голосов
/ 20 января 2012

Прежде всего, ваш ключ состоит из множества символов. Помните, что имя ключа также занимает память (1 байт / символ), поэтому постарайтесь сделать его как можно более коротким. Я видел ситуации, когда имя ключа было больше, чем значение, что может случиться, если у вас есть случаи, когда вы храните пустой массив или пустое значение.

Структура ключа. Из вашего примера я предполагаю, что объект, который вы хотите сохранить, идентифицируется с помощью параметров (один из которых может быть идентификатором элемента или может быть фильтром для поиска [...]). Начните с префикса. Префикс должен быть именем класса объекта (или упрощенным именем, изображающим объект в целом).

В большинстве случаев ключи будут иметь префикс + идентификатор. В вашем примере у вас есть несколько идентификаторов. Если один из них является уникальным идентификатором, используйте только prefix + id, и этого должно быть достаточно.

Если объект большой и вы не всегда используете его все, измените свою стратегию на хранилище с несколькими ключами. Используйте один главный ключ для хранения наиболее распространенных значений или для хранения компонентов объекта, значения которых хранятся в отдельных ключах. Используйте каналы и получите весь объект в одном соединении, используя один «множественный» запрос:

 mainKey = prefix + objectId;
 object = getFromCache(mainKey);

 startCachePipeline();
 foreach (object[properties] as property) {
      object->property = getFromCache(prefix + objectId + property);
 }
 endCachePipeline();

Структура для примера объекта «Персона» будет выглядеть примерно так:

 person_33 = array(
      properties => array(age, height, weight)
 );
 person_33_age = 28;
 person_33_height = 6;
 person_33_weight = 150;

Memcached использует память наиболее эффективно, когда объекты, хранящиеся внутри, имеют одинаковые размеры. Чем больше разница в размерах между объектами (не говоря уже о 1 потерянном большом объекте или единичных случаях, хотя память также теряется), тем больше теряется память.

Надеюсь, это поможет!

...