Memcached的键可以包含空格吗?

25

我似乎遇到了具有空格的memcached键的问题,尽管我无法确定具体是什么问题。


1
@Ethan,那里的结果是在谈论一个特定的Python库,它与memcached通信,而不是关于memcached本身。 - Charles
@Ethan 我肯定做了那个搜索。基本上只有一篇关于此的博客文章,没有太多细节,而且大部分时间 memcache 键与空格一起使用对我来说都有效。希望能从乐于助人的 SO 社区获得更多信息。 - philfreo
5个回答

48

更详细的回答(由达斯汀提到,但未引用):

使用memcached存储的数据是通过键来标识的。键是一个文本字符串,应该可以唯一地标识对于希望存储和检索它的客户端来说,这些数据。目前,键的长度限制设置为250个字符(当然,通常客户端不需要使用如此长的键);该键不能包含控制字符或空格。

来源:protocol.txt (特定版本)


7
“控制字符”是什么? - artm
2
控制字符是 \n 或 \t 等。详见 http://zh.wikipedia.org/wiki/控制字符 - AntonioCS

25

不行,Memcached的键名不能包含空格。


18
好的,我会尽力进行翻译。以下是需要翻译的内容:some citation, proof, or reasoning would be nice希望能提供一些引用、证明或推理。 - philfreo
4
我曾负责核心服务器的那部分工作,并编写了许多客户端和其他服务器。原始的protocol.txt文件清晰地阐述了关键格式。 - Dustin
1
知道在键中有空格时会发生什么可能会很有帮助。它是否只是丢弃任何get/set操作? - Hal50000

2

Memcached客户端似乎不会为了性能而验证键。

我通常创建一个名为createWellFormedKey($key)的方法,并将返回的结果传递给memcached客户端的set()get()方法。

除非base64版本超过250个字符,否则我不使用md5和sha1哈希。这是因为在性能方面,md5和sha1更昂贵的操作。

PHP示例代码如下:

/**
 * Generates a well formed key using the following algorithm:
 * 1. base64_encode the key first to make sure all characters are valid
 * 2. Check length of result, less than 250 then return it
 * 3. Length of result more than 250 then create a key that is md5($validKey).sha1($validKey).strlen($validKey)
 */
private function createWellFormedKey($key) {
    // Get rid of all spaces, control characters, etc using base64
    $validKey = base64_encode($key);

    $validKeyLength = strlen($validKey);
    // 250 is the maximum memcached can handle
    if (strlen($validKey) < 250) {
        return $validKey;
    }

    $validKey = md5($validKey).sha1($validKey).$validKeyLength;
    return $validKey;
}

1

目前我正在使用PHP和memcached进行实验,我认为所描述的问题可以通过使用哈希算法(如md5和sha1或其他算法)轻松解决。

我使用了md5哈希、sha1哈希和sha256以及给定密钥的长度的组合。显然,这种方法可以简化为两个哈希方法+密钥长度,因此您可以轻松避免使用不应出现在密钥中的空格或其他字符。

我认为哈希碰撞被避免是因为两个哈希算法都发生碰撞的概率几乎为0。通过在密钥中另外使用密钥长度,碰撞问题也得到了解决。


0

使用memcached二进制协议的应用程序可以使用包含空格的键,但仍然存在250字节长度限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接