Dictionary 如何为密钥/值存储设计/创建密钥?

Dictionary 如何为密钥/值存储设计/创建密钥?,dictionary,memcached,key,outputcache,voldemort,Dictionary,Memcached,Key,Outputcache,Voldemort,我想将序列化对象(或任何东西)存储在键/值缓存中 现在我做了这样的事情: public string getValue(int param1, string param2, etc ) { string key = param1+"_"+param2+"_"+etc; string tmp = getFromCache(); if (tmp == null) { tmp = getFromAnotherPlace(); addToCa

我想将序列化对象(或任何东西)存储在键/值缓存中

现在我做了这样的事情:

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

我觉得可能会很尴尬。如何设计钥匙?

首先,您的钥匙似乎由许多字符组成。请记住,键名也会占用内存(1字节/字符),因此请尽量使其简短。我见过键名大于值的情况,如果存储空数组或空值,就会发生这种情况

关键结构。从您的示例中,我猜您要存储的对象是由参数标识的(一个可能是项目id,或者可能是搜索的过滤器[…])。以前缀开头。前缀应为对象类的名称(或通常描述对象的简化名称)

大多数情况下,键将具有前缀+标识符。在您的示例中,您有多个标识符。如果其中一个id是唯一的,只需使用
前缀+id
,就足够了

如果对象很大,并且您并不总是使用所有对象,那么请将策略更改为多键存储。使用一个主键存储最常用的值,或存储对象的组件,其值存储在单独的键中。使用管道并使用一个“多”查询在一个连接中获取整个对象:

示例“Person”对象的结构如下所示:

 person_33 = array(
      properties => array(age, height, weight)
 );
 person_33_age = 28;
 person_33_height = 6;
 person_33_weight = 150;
当内存中存储的对象大小相似时,Memcached使用内存的效率最高。对象之间的大小差异越大(不包括1个丢失的大对象或单个情况,尽管内存也会被浪费),浪费的内存就越多


希望有帮助

如果我理解了这个问题,我认为制作密钥最简单、最聪明的方法是使用单向散列函数,如MD5、SHA1 ecc

这样做至少有两个原因:

  • 得到的密钥肯定是唯一的!(实际上MD5和SHA1都已开裂()
  • 生成的关键点具有固定的长度
  • 你必须给你的对象作为函数的参数,你有你的唯一键。
    我不太懂c#,但我很确定你可以找到内置的单向散列函数。

    我应该补充一点,我在c#,但这并不重要,你的反射过程需要大量CPU吗?你知道这个方法是否需要大量CPU来创建散列吗?如果函数是用c#语言构建的,我认为它是即时的。在示例a中pentium P5 90Mhz和MD5每秒可产生13.2MB。。
     person_33 = array(
          properties => array(age, height, weight)
     );
     person_33_age = 28;
     person_33_height = 6;
     person_33_weight = 150;