`
xiemingmei
  • 浏览: 211130 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

客户端实现多个Memcached服务集群

阅读更多
客户端实现多个Memcached服务集群

Memcached服务器之间是独立的,没有任何关联,不能进行集群,Memcached集群是从客户端实现的。

应用系统使用统一的访问Memcached配置,在调用client包来set(key,value), get(key)时,使用相同选取服务器节点的算法,这样就实现了取到先前存入的对象。

选取服务器节点的算法思路是key的哈希值与节点数取模,比如,有Memcached服务器n0,n1,n2,n3,n4,key为"user_name",那么就是 hash(username)%5,如果结果为0就选取n0,依次类推。

选取服务器接点的算法一般封装在memcached client包中。

MemcachedSession session = (MemcachedSession) this.findSessionByKey(msg				.getKey());

//默认使用这个会话定位器
private MemcachedSessionLocator sessionLocator = new ArrayMemcachedSessionLocator();

// 使用一致性哈希算法(Consistent Hash Strategy)  建议使用。
builder.setSessionLocator(new KetamaMemcachedSessionLocator());  




ArrayMemcachedSessionLocator:

public final long getHash(int size, String key) {
	long hash = this.hashAlgorighm.hash(key);
	return hash % size;
}

public final Session getSessionByKey(final String key) {
		if (this.sessions == null || this.sessions.size() == 0) {
			return null;
		}
		// Copy on read
		List<List<Session>> sessionList = this.sessions;
		int size = sessionList.size();
		if (size == 0) {
			return null;
		}
		long start = this.getHash(size, key);
		List<Session> sessions = sessionList.get((int) start);
		Session session = getRandomSession(sessions);

		// If it is not failure mode,get next available session
		if (!this.failureMode && (session == null || session.isClosed())) {
			long next = this.getNext(size, start);
			while ((session == null || session.isClosed()) && next != start) {
				sessions = sessionList.get((int) next);
				next = this.getNext(size, next);
				session = getRandomSession(sessions);
			}
		}
		return session;
	}



KetamaMemcachedSessionLocator:
public final Session getSessionByKey(final String key) {
		if (this.ketamaSessions == null || this.ketamaSessions.size() == 0) {
			return null;
		}
		long hash = this.hashAlg.hash(key);
		Session rv = this.getSessionByHash(hash);
		int tries = 0;
		while (!this.failureMode && (rv == null || rv.isClosed())
				&& tries++ < this.maxTries) {
			hash = this.nextHash(hash, key, tries);
			rv = this.getSessionByHash(hash);
		}
		return rv;
	}

	public final Session getSessionByHash(final long hash) {
		TreeMap<Long, List<Session>> sessionMap = this.ketamaSessions;
		if (sessionMap.size() == 0) {
			return null;
		}
		Long resultHash = hash;
		if (!sessionMap.containsKey(hash)) {
			// Java 1.6 adds a ceilingKey method, but xmemcached is compatible
			// with jdk5,So use tailMap method to do this.
			SortedMap<Long, List<Session>> tailMap = sessionMap.tailMap(hash);
			if (tailMap.isEmpty()) {
				resultHash = sessionMap.firstKey();
			} else {
				resultHash = tailMap.firstKey();
			}
		}
		//
		// if (!sessionMap.containsKey(resultHash)) {
		// resultHash = sessionMap.ceilingKey(resultHash);
		// if (resultHash == null && sessionMap.size() > 0) {
		// resultHash = sessionMap.firstKey();
		// }
		// }
		List<Session> sessionList = sessionMap.get(resultHash);
		if (sessionList == null || sessionList.size() == 0) {
			return null;
		}
		int size = sessionList.size();
		return sessionList.get(this.random.nextInt(size));
	}



分享到:
评论

相关推荐

    memcached集群linux搭建

    - **Cache层**:包含多个Memcached实例,提供实际的缓存服务。 - **Control层**:监控集群状态,执行动态扩缩容操作。 在实际部署中,需要安装和配置MoonBox代理服务器,以及监控和控制工具。这通常涉及到编写配置...

    Memcached集群搭建

    本文将详细介绍如何在多个服务器上搭建一个Memcached集群,以实现数据的高可用性和负载均衡。 ### 一、安装Memcached 在开始搭建集群之前,首先需要在所有参与节点上安装Memcached。对于Linux系统,通常使用包管理...

    Memcached 客户端 服务端 管理工具

    - **`mcmaster`**:在分布式环境中,mcmaster可以用于集群管理和故障转移,监控多个Memcached节点的状态,并在节点失效时自动重新分配数据。 - **`telnet`**:最基础的管理方式是直接通过telnet连接到Memcached...

    tomcat + apache + memcached 集群jar包

    在集群环境中,多个Memcached节点可以共享数据,确保即使单个节点出现故障,其他节点也能继续提供服务。这种缓存策略对于处理高并发请求的Web应用特别有效。 集群配置的步骤通常包括以下部分: 1. **安装和配置...

    Memcached 服务端,客户端,C#

    6. 分布式哈希:在多台Memcached服务器集群中自动分配键值对,实现负载均衡。 使用C#客户端连接Memcached的步骤大致如下: 1. 创建Memcached客户端实例,指定服务器地址和端口。 2. 使用Set方法存储数据,如`client...

    Memcached内存分析、调优、集群.pptx

    2. 集群:Memcached支持集群模式,多台服务器组成一个集群,提供高可用性和高性能。 Memcached客户端 1. Memcached客户端:Memcached提供了多种语言的客户端,包括C/C++、PHP、Java、Python、Ruby、Perl等。 2. ...

    memcached实现多个tomcat 共享一个session

    标题中的“memcached实现多个tomcat共享一个session”是指在分布式系统中,通过使用memcached作为session存储介质,实现多台Tomcat服务器之间的session共享。这样可以确保用户在集群中的任意一台服务器上登录后,其...

    Memcached 内存分析、调优、集群

    - **Page**:一个page是一个连续的内存块,被划分为多个chunks。 ##### Item Item是指缓存中的具体数据项。每个item都关联着一个键值对,以及相关的元数据,如过期时间等。 #### 4. Memcached分布式:一致性Hash ...

    Nginx+Tomcat+MemCached_集群配置

    总体来说,Nginx+Tomcat+Memcached 的集群配置是一项复杂的系统工程,涉及到网络通信、负载均衡、缓存策略等多个方面。理解和掌握这一架构有助于构建高效、稳定且可扩展的 web 应用服务。通过深入学习和实践,我们...

    tomcat6 Memcached集群

    总结来说,整合Tomcat6与Memcached集群实现了跨服务器的Session共享,解决了分布式环境下的会话一致性问题,提升了系统的可扩展性和可用性。同时,这种方案也有助于减少对单个服务器的依赖,提高整体系统的容错能力...

    tomcat与memcached集群jar

    标题中的“tomcat与memcached集群jar”指的是在Apache Tomcat...总的来说,"tomcat与memcached集群jar"提供了一个便捷的方式,让开发者能够在Tomcat环境中快速实现Memcached缓存功能,提升Web应用的效率和可扩展性。

    memcached java客户端驱动包

    驱动包支持Memcached的集群方案,这意味着开发者可以连接到多个Memcached服务器,从而实现数据的高可用性和负载均衡。通过设置服务器列表,驱动包会自动处理数据在集群中的分布和路由,使得应用程序无需关心底层细节...

    go语言memcached客户端.zip

    8. **分布式一致性哈希**:在分布式Memcached集群中,客户端可能使用一致性哈希算法来平衡数据分布,保证在节点增减时尽可能少地重新分布数据。 9. **TTL(Time To Live)管理**:客户端需要支持设置缓存项的生存...

    memcached客户端所需jar包

    2. **Apache Commons** 库:描述中提到了"commons-所有包下载",这可能是指Apache Commons项目提供的多个库,如Commons Lang、Commons Pool等。这些库提供了许多实用工具类和功能,可以辅助Memcached客户端的实现。...

    tomcat中Nginx+memcached实现session共享

    在分布式系统中,Session共享是一个常见的挑战,尤其是在多个应用服务器如Tomcat之间。为了实现这一目标,我们可以结合Nginx反向代理服务器和memcached内存缓存系统来达到高效、可靠的Session共享。以下是对这个主题...

    memcached linux windows 安装 使用 缓存 集群

    创建Memcached集群通常涉及配置多个实例,以及使用客户端库支持分布式存储。 总结来说,Memcached是跨平台的缓存解决方案,适用于Windows和Linux环境。通过正确配置和使用,它可以显著提升Web应用的性能,减少对...

    Memcached内存分析、调优、集群

    - **Page**:在某些实现中,slab由多个page组成,每个page包含多个chunk。 - **Item**:存储在slab中的数据单元,包含键、值和附加信息。 #### 4. Memcached分布式:一致性Hash 在分布式环境中,Memcached通常使用...

    memcached客户端与服务端

    - **多服务器支持**:客户端可以配置多个服务器,当一个服务器不可用时,请求会自动转发到其他服务器,实现负载均衡。 ### 应用场景 Memcached 主要用于以下场景: 1. **减少数据库访问**:将经常访问的数据存储在...

    Memcached负载均衡Jar包大全

    它的使用通常包括初始化一个MemcachedClient实例,配置服务器节点,然后通过这个客户端对象进行get和set操作来存取数据。 其次,Xmemcached是另一个强大且高效的Java客户端,它支持多线程、NIO和Future模式,提供了...

    Nginx+Tomcat+Memcached集群Session共享

    标题 "Nginx+Tomcat+Memcached集群Session共享" 描述了在分布式环境中如何通过Nginx反向代理服务器、Tomcat应用服务器集群以及Memcached缓存系统来实现Session的共享。这是一个常见的高可用性和负载均衡解决方案。...

Global site tag (gtag.js) - Google Analytics