使用MemCached做为缓存系统时,常遇到Key Value的大小长度超出限制的问题。Key要求小于250个字符,Value要求小于1MB。按照MemCached官方的说法,出于缓存的效率性能考虑,若是超过了限制通常须要考虑是否系统的设计出了问题。算法
Key长度超过250字符时,首先应该想到的是可以尽可能缩短key的长度,好比将子Key字符串组合改成位运算整合后的32位整数。最后实在没办法能够尝试Hash函数缩短key。但因为Hash函数是多对一的映射,免不了会出现碰撞的问题。无论是采用CRC32算法仍是MD5甚至SHA算法,只是碰撞几率大小的问题。缓存
为解决Hash函数的碰撞问题,能够将原始Key加Value包装为新的Value存入MemCached。app
class CacheWrapper {函数
String originalKey = null;性能
String value;设计
}对象
该方法使用了附加的originalkey字段存入缓存,取缓存时使用double check检查是否存在Hash碰撞。能够看因为Hash碰撞,会出现取到无效的缓存数据的可能,但考虑到通常的Hash函数的碰撞几率仍是比较低的,因此该状况的仍是比较难出现。字符串