解决MemCached Key的长度限制问题

使用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;设计

}对象

  • 存入缓存时,若是original key长度没有超过250,CacheWrapper中的字段origianlKey不设值,直接使用(originalKey, CacheWrapper)存入MemCached。若是长度超过250,设置CacheWrapper中的字段origianlKey,使用(Hash(originalKey), CacheWrapper)存入MemCached。
  • 从缓存中取数据时,若是命中而且original key长度没有超过250, 直接从缓存对象CacheWrapper中取值就可。若是original key 长度超过250,这时须要使用Hash(originalKey)从缓存中获取CacheWrapper对象。若是命中,还须要比较CacheWrapper中的originalKey是否为预期值。若是original key为预期值说明没有出现Hash碰撞,真实的命中了缓存,若是不为预期值,说明该次缓存没有命中。

该方法使用了附加的originalkey字段存入缓存,取缓存时使用double check检查是否存在Hash碰撞。能够看因为Hash碰撞,会出现取到无效的缓存数据的可能,但考虑到通常的Hash函数的碰撞几率仍是比较低的,因此该状况的仍是比较难出现。字符串

相关文章
相关标签/搜索