解決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函數的碰撞機率仍是比較低的,因此該狀況的仍是比較難出現。字符串

相關文章
相關標籤/搜索