2012-01-19 79 views
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; 
} 

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

回答

1

如果我理解这个问题,我想做出一个关键的最简单和最聪明的方法是使用一个单向散列函数如MD5,SHA1 ECC ...

至少有两个理由这样做:

  1. 产生的关键是肯定的唯一!(实际上是MD5和SHA-1都已经被破解(=)
  2. 产生的关键有一个固定的lenght!

你有给你的对象作为函数的参数,你有你唯一的关键。 我不太了解c#,但我确定你可以找到一个单向散列函数。

+0

你知道这个方法是否需要大量的CPU来创建哈希? –

+0

如果函数是用我认为是即时语言编写的。例如Pentium P5 90Mhz与MD5使得每秒13.2 MB .. –

+0

好的,谢谢,我会混合一些反射 –

0

首先你的钥匙似乎是由很多人物组成的。请记住,密钥名称也占用内存(1字节/字符),所以尽量保持它尽可能短。我已经看到了密钥名称大于值的情况,如果您有存储空数组或空值的情况,可能会发生这种情况。

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

大多数情况下,密钥都会有一个前缀+标识符。在你的例子中你有多个标识符。如果其中一个是唯一的ID,那么只能使用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个丢失的大对象或单个案例,尽管内存也浪费了),那么浪费的内存就越多。

希望它有帮助!

+0

我应该添加我在C#中,但它并不重要,您的反射过程是否需要大量的CPU? –