繁体   English   中英

如何在Cookie中存储和优化大价值

[英]How to store and optimize large values in cookies

我需要将用户首选项存储在cookie中。

  • 我有三个选择下拉菜单和日期。
  • 允许用户选择下拉菜单中的所有值。

如果我将所有唯一(8个字符)值存储在cookie中,那么它将变得超载。 我需要一种机制来进行一些映射,以便将最小值存储在cookie中。

我的要求与这个问题匹配,但唯一的区别是我有大量数据集(每个选择列100个项目)。

两种可能性:

A)使您的值成为数字和2的幂(1、2、4、8、16等),并将单个值存储为cookie作为位图。 (或者在服务器端代码中,将不同的值映射为2的幂。)

B)将值存储在cookie中作为定界列表。

更新时间:6:40PM

看到您可以进行大量选择,我的原始解决方案都无法正常工作。 为了处理大量数据,我认为您将需要创建某种“会话ID”,将实际设置保存在数据库或其他持久性存储中,并将会话ID存储在Cookie中。

(当然,您可以使Cookie仅在浏览器会话期间保持不变,并在可以合理确定浏览器会话已结束-大约一周后删除存储的设置。)

这是个好问题。 根据您的要求,我认为如何进行操作没有太多选择。 正如ThatBlairGuy所建议的那样,似乎有些路要走了。 您的300个选择转换为300位。 现在,我个人将坚持只使用每字节6位,以便快速轻松地转换为base64,以用于存储目的。 300/6 = 50个字符,代表下拉菜单中的值。

但是,必须始终对任何首选项的值进行硬编码,您不能在中间删除或添加任何值:任何新的首选项都必须在位图的末尾添加,或者使用不再使用的位在地图上的某处。

编辑:鉴于评论重新。 位图,我将充实实现时的想法。 假设有一点,每个对应于特定选项的关闭开关(下拉框中的一项):

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]));
    }
};

免责声明:我没有测试以上任何一项。

您可以存储所选项目的索引。 例如,如果用户从列表A中选择了项1和3,从列表B中选择了项4,并且从列表C中选择了前10个项,则将得到以下内容:

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

但是,您必须编写一些简单的解析代码才能读出值。

在最坏的情况下,当用户选择了所有奇数或偶数项目时,包含总共100个项目的列表将需要大约150个字符。 如果用户选择了全部100个项目,则只需要A[0-99]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM