Как хранить и оптимизировать большие значения в куки - PullRequest
2 голосов
/ 23 июля 2010

Мне нужно сохранить пользовательские настройки в куки.

  • У меня три раскрывающихся списка и дата.
  • Пользователь может выбрать все значения в выпадающих списках.

Если я сохраню все уникальные (8 символов) значения в файле cookie, он будет перегружен. Мне нужен механизм для отображения, чтобы минимальное значение сохранялось в cookie.

Мое требование соответствует этот вопрос , но единственное отличие состоит в том, что у меня большой набор данных (100 элементов в выбранном столбце).

Ответы [ 3 ]

3 голосов
/ 23 июля 2010

Две возможности:

A) Сделайте ваши значения числовыми и степенями 2 (1,2,4,8,16 и т. Д.) И сохраните одно значение в файле cookie в виде растрового изображения. (Или в коде на стороне сервера сопоставьте различные значения степеням 2).

B) Сохраните значения в файле cookie в виде списка с разделителями.

Обновлено: 6:40 вечера

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

(Вы, конечно, захотите, чтобы куки сохранялись только в течение сеанса браузера и удаляли сохраненные настройки после того, как вы можете быть уверены, что сеанс браузера завершился - возможно, через неделю или около того.)

2 голосов
/ 23 июля 2010

Хороший вопрос.Учитывая ваши требования, я не вижу большого выбора, как действовать дальше.Как предположил ThatBlairGuy, битовая карта, кажется, является подходящим вариантом.Ваши 300 вариантов выбора переводятся в 300 бит.Теперь я лично предпочел бы использовать только 6 бит на байт, чтобы сделать быстрый и простой перевод на base64 для целей хранения.300/6 = 50 символов для значений, поступающих из раскрывающегося списка.

Значение любого параметра должно быть жестко закодировано, хотя вы не можете удалить или добавить его в середине: любое новое предпочтениедолжен быть добавлен в конце битовой карты или использовать бит, который больше не используется где-то на карте.

Редактировать: Учитывая комментарии re.немного карты, я уточню, что я имел в виду для реализации.Если предположить, что бит соответствует каждому выключателю определенной опции (запись в выпадающем списке):

this.bitmap = [];
this.customBase64code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-";
...
// index=index of bit within bit map, on=state of the bit
this.setOption=function(index,on) {
    var islot = Math.floor(index / 6);
    var ibit = index % 6;
    if ( this.bitmap[islot] === undefined ) {
        while ( this.bitmap.length <= islot ) {
            this.bitmap.push(0);
        }
    }
    if (on) {
        this.bitmap[islot] |= (1 << ibit);
    }
    else {
        this.bitmap[islot] &= ~(1 << ibit);
    }
};
this.getOption=function(index) {
    var islot = Math.floor(index / 6);
    if ( this.bitmap[islot] === undefined ) {
        return 0;
        }
    return this.bitmap[islot] & (1 << (index % 6));
};
this.getStringFromOptions=function() {
    var bitmap64 = [];
    var encoder64 = customBase64code.split('');
    var n = this.bitmap.length;
    for ( var i = 0; i < n; i++ ) {
        bitmap64.push(encoder64[this.bitmap[i]]);
    }
    return bitmap64.join('');
};
this.getOptionsFromString=function(s) {
    var bitmap64 = s.split('');
    var decoder64 = this.customBase64code;
    var n = bitmap64.length;
    for ( var i = 0; i < n; i++ ) {
        this.bitmap.push(decoder64.indexOf(bitmap64[i]));
    }
};

Отказ от ответственности: я не проверял ничего из перечисленного.

1 голос
/ 23 июля 2010

Вы можете хранить индексы выбранных элементов. Например, если пользователь выбрал элементы 1 и 3 из списка A, элемент 4 из списка B и первые 10 элементов списка C, вы получите что-то вроде этого:

A[0,2],B[3],C[0-9]

Вы должны написать какой-то простой код для разбора значений.

В худшем случае, когда пользователь выбрал все нечетные или четные элементы, вам потребуется около 150 символов для списка, содержащего в общей сложности 100 элементов. Если пользователь выбрал все 100 пунктов, вам потребуется только A[0-99].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...