Memcached集群及hash算法
memcached是业内使用最多,最稳定的内存缓存服务器,danga的java_memcached-client也是比较稳定的一款java分布式集群客户端。
其实现原理是利用hash算法实现服务器定位,保证读写都在同一台。memcached集群数据互补,没有主从和备份,这是很多公司节约成本的做法。所以在一台服务器宕机的情况下,读写都无法进行,转到nosql数据库或RDBMS,并在服务器重新启动后容错工具容错就行。
所以memcached的部署和客户端还是很简单。memcached协议基于文本,也不难。至于hash算法实现如下:
private long getHash( String key, Integer hashCode ) { if ( hashCode != null ) { if ( hashingAlg == CONSISTENT_HASH ) return hashCode.longValue() & 0xffffffffL; else return hashCode.longValue(); } else { switch ( hashingAlg ) { case NATIVE_HASH: return (long)key.hashCode(); case OLD_COMPAT_HASH: return origCompatHashingAlg( key ); case NEW_COMPAT_HASH: return newCompatHashingAlg( key ); case CONSISTENT_HASH: return md5HashingAlg( key ); default: // use the native hash as a default hashingAlg = NATIVE_HASH; return (long)key.hashCode(); } } }
private long getBucket( String key, Integer hashCode ) { long hc = getHash( key, hashCode ); if ( this.hashingAlg == CONSISTENT_HASH ) { return findPointFor( hc ); } else { long bucket = hc % buckets.size(); if ( bucket < 0 ) bucket *= -1; return bucket; } }