`

memcache的分布式hash算法

 
阅读更多

	/** 
	 * Internal private hashing method.
	 *
	 * This is the original hashing algorithm from other clients.
	 * Found to be slow and have poor distribution.
	 * 
	 * @param key String to hash
	 * @return hashCode for this string using our own hashing algorithm
	 */
	private static long origCompatHashingAlg( String key ) {
		long hash   = 0;
		char[] cArr = key.toCharArray();

		for ( int i = 0; i < cArr.length; ++i ) {
			hash = (hash * 33) + cArr[i];
		}

		return hash;
	}

	/** 
	 * Internal private hashing method.
	 *
	 * This is the new hashing algorithm from other clients.
	 * Found to be fast and have very good distribution. 
	 *
	 * UPDATE: This is dog slow under java
	 * 
	 * @param key 
	 * @return 
	 */
	private static long newCompatHashingAlg( String key ) {
		CRC32 checksum = new CRC32();
		checksum.update( key.getBytes() );
		long crc = checksum.getValue();
		return (crc >> 16) & 0x7fff;
	}

	/** 
	 * Internal private hashing method.
	 *
	 * MD5 based hash algorithm for use in the consistent
	 * hashing approach.
	 * 
	 * @param key 
	 * @return 
	 */
	private static long md5HashingAlg( String key ) {
		MessageDigest md5 = MD5.get();
		md5.reset();
		md5.update( key.getBytes() );
		byte[] bKey = md5.digest();
		long res = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8) | (long)(bKey[0]&0xFF);
		return res;
	}

	/** 
	 * Returns a bucket to check for a given key. 
	 * 
	 * @param key String key cache is stored under
	 * @return int bucket
	 */
	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();
			}
		}
	}

 

默认是NATIVE_HASH这种。

分享到:
评论

相关推荐

    memcache分布式一致性hash

    分布式一致性哈希是一种解决在分布式缓存系统中如何高效、稳定地分配数据的算法,尤其在Memcache等缓存服务中广泛应用。它旨在确保当缓存集群中的节点增减时,对现有数据的映射影响最小,从而降低数据迁移和系统压力...

    MemCache详细解读1

    为了解决这个问题,一致性Hash算法被引入。一致性Hash可以更好地处理服务器数量变化时的数据迁移,确保在添加或删除服务器时,只有一小部分数据需要重新分配,从而降低对缓存命中率的影响。 总的来说,MemCache是...

    memcache_php使用测试

    - **memcache.hash_strategy** 和 **memcache.hash_function**: 控制key到服务器的映射策略及哈希函数,通过设置不同的策略和函数,可以优化数据分布和负载均衡,比如标准哈希策略和CRC32算法通常用于提高一致性。...

    memcache一致性hash的php实现方法

    在这个PHP实现的案例中,一致性哈希被用于解决Memcache分布式缓存系统的问题。Memcache是常见的内存缓存系统,它提供快速的数据存储和检索服务。在分布式环境中,多个Memcache服务器可以协同工作,存储和处理大量...

    Java开发中的Memcache原理及实现

    - 分布式存储:Memcached采用分散式哈希(Distributed Hash Table,DHT)策略,将数据根据键(key)均匀地分布到各个服务器节点上,从而实现数据的分布式存储。 - 内存存储:所有数据都存储在内存中,提供高速访问...

    分布式键值系统-Tair1

    Tair采用一致性哈希算法实现数据的分布式存储。每个数据项根据其主键哈希后映射到Q个桶(bucket)之一,config server按照预设策略将这些桶均匀分配到各个data server上。由于数据按照主键哈希分布,每个桶中的数据...

    memcache架构图

    Memcached采用分布式哈希(Distributed Hash Table, DHT)策略来存放数据。每个节点根据预设的算法(如一致性哈希)负责一部分键值对的存储,当新的节点加入或节点下线时,数据分布能够相对平滑地调整,避免大规模...

    神级memcached源代码分析文档_1.4.0代码分析

    - hash.h\hash.c:实现server端的哈希算法。 - assoc.h\assoc.c:管理server端的哈希表。 - items.h\items.c:管理server端的对象。 - slabs.h\slabs.c:负责内存管理。 - memcached.h\memcached.c:主要逻辑及main...

    php模块memcache和memcached区别分析

    - 一致性哈希算法在分布式缓存系统中至关重要,因为它能有效地在节点增删时保持数据分布的稳定。 - 对于memcache,可以在php.ini配置文件中设置`Memcache.hash_strategy`为`consistent`,以及`memcache.hash_...

    PHP中使用memcache存储session的三种配置方法

    `memcache.hash_strategy`用于选择Memcache的哈希策略,`consistent`是一种哈希算法,能够保持同一个key在同一个服务器上的存储,适合分布式部署。`session.save_path`指定了memcache服务器的地址和端口,如果有多个...

    PHP数据库操作二:memcache用法分析

    Memcache是一款高性能的分布式内存对象缓存系统,专门用于存储键值对,通过在内存中维护一个巨大的哈希表,它可以对数据库查询结果、文件等数据进行缓存。Memcache的目的是为了减轻数据库压力,加速动态Web应用,...

    java大厂面试题.docx

    3. **一致性Hash算法的实现原理** 一致性哈希算法通过将哈希值映射到一个环形空间上,使得数据的分布相对均匀,即使在节点增减时,只有少数数据需要迁移。这样保证了系统的稳定性和效率。 4. **Memcached与Redis的...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    memcache eacache Tair 消息队列 jms Queue Topic kafka 持久 复制 Stream Partition rocketMQ RabbitMQ ActiveMQ 常用开源框架 Spring Spring MVC Spring WebFlow spring tx aop ioc Struts...

    百度最新面经-Java 工程师

    * 缓存数据库 Memcache 的集群模式和一致性 Hash * Redis 的基本数据类型 网络模块 * 一个 URL 请求的过程 * HTTP 状态码的意义(502、406、302) * 三次握手和四次挥手 * Vi 编辑器的两种模式和跳转到最后一行 * ...

    MemcacheRedisMongoDB数据缓存系统方案对比与分析.docx

    Memcached的分布式实现是在客户端,通过特定算法决定数据应存储在哪个节点,形成分布式架构。 **Redis**,与Memcached相似,支持更多类型的value,如字符串、链表、集合和有序集合,且支持原子性操作。此外,Redis...

    memcached全面剖析

    它采用hash表存储数据,通过哈希算法快速定位数据,提供快速访问。 3. **分布式特性**:memcached通过一致性哈希策略实现数据的分布式存储,可以在多台服务器之间分发负载,确保高可用性和可扩展性。 4. **缓存...

Global site tag (gtag.js) - Google Analytics