我似乎遇到了具有空格的memcached键的问题,尽管我无法确定具体是什么问题。
更详细的回答(由达斯汀提到,但未引用):
键
使用memcached存储的数据是通过键来标识的。键是一个文本字符串,应该可以唯一地标识对于希望存储和检索它的客户端来说,这些数据。目前,键的长度限制设置为250个字符(当然,通常客户端不需要使用如此长的键);该键不能包含控制字符或空格。
来源:protocol.txt (特定版本)
不行,Memcached的键名不能包含空格。
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;
}
目前我正在使用PHP和memcached进行实验,我认为所描述的问题可以通过使用哈希算法(如md5和sha1或其他算法)轻松解决。
我使用了md5哈希、sha1哈希和sha256以及给定密钥的长度的组合。显然,这种方法可以简化为两个哈希方法+密钥长度,因此您可以轻松避免使用不应出现在密钥中的空格或其他字符。
我认为哈希碰撞被避免是因为两个哈希算法都发生碰撞的概率几乎为0。通过在密钥中另外使用密钥长度,碰撞问题也得到了解决。
使用memcached二进制协议的应用程序可以使用包含空格的键,但仍然存在250字节长度限制。