0

我想将序列化对象(或其他)存储在键/值缓存中。

现在我做这样的事情:

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

我认为这可能很尴尬。如何设计钥匙?

4

2 回答 2

1

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

这样做至少有两个原因:

  1. 生成的密钥肯定是唯一的!(实际上 MD5 和 SHA1 都已被破解 (= )
  2. 生成的密钥具有固定长度!

您必须将您的对象作为函数的参数,并且您拥有唯一的密钥。我不太了解 c#,但我很确定您可以找到内置的单向哈希函数。

于 2012-03-02T10:38:15.483 回答
0

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

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

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

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

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

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

示例“Person”对象的结构将类似于:

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

当存储在其中的对象大小相似时,Memcached 使用内存的效率最高。对象之间的大小差异越大(不是说 1 个丢失的大对象或单个案例,尽管内存也会被浪费),浪费的内存就越多。

希望能帮助到你!

于 2012-01-20T18:00:51.140 回答