Java操作memcached(一)

Memcached实际上就是两次Hash算法
   第一次hash算法是用来定位Memcached实例的
   第二次hash算法是底层HashMap中的hash算法


Hash算法
     1.根据余数来进行计算(其实java中的HashMap的hash算法也是用的这种方式)
     2.一致性hash算法
         C的客户端  --->libMemcached已经实现了该功能,C的开发人员直接使用它。
新浪----->Memcachedb  实现了持久化功能


java的客户端
 a官方的 memcached client for java
    比较稳定
    用了jdk比较早的版本,性能稍差,并且使用的BIO
 b.spyMemcached
    NIO,线程池框架
    一致性hash
    稳定性差,报timeout异常
 c.xMemcached 
     java nio
     java 线程池
     性能比spyMemcached要好
     并且比较稳定,且和spring等框架能够很好的结合使用
     一致性hash
 d.淘宝包装的java客户端
   java nio
   线程池框架
   cluster机制

   结合本地缓存


接下来我们使用第一种  


这是需要的jar

package com.chengxi.memc.test;

import org.junit.Test;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class MemcachedTest01 {
	@Test
	public void testOne() throws Exception {
		
		MemCachedClient client = new MemCachedClient();
		//mem服务器地址
		String[] addr = {"192.168.0.140:11211"};
		//对应的权重
		Integer[] weight = {3};
		SockIOPool pool = SockIOPool.getInstance();
		
		pool.setServers(addr);
		pool.setWeights(weight);
		pool.setInitConn(5);
		pool.setMinConn(5);
		pool.setMaxConn(200);
		pool.setMaxIdle(1000*30*30);
		pool.setMaintSleep(30);
		
		//socket param timeout 
		pool.setNagle(false);
		pool.setSocketTO(30);
		pool.setSocketConnectTO(0);
		
		//start 
		pool.initialize();
		
		//client.set("name", "wzh");
		//System.out.println(client.get("name"));
		Student student = new Student();
		student.setId(1);
		student.setName("呵呵");
		
		client.set("student1",student);
		
		System.out.println(client.get("student1"));
	}
	
	@Test
	public void two(){
		MemCachedClient client = new MemCachedClient();
		//mem服务器地址
		String[] addr = {"192.168.0.140:11211","192.168.0.140:11212"};
		//对应的权重
		Integer[] weight = {5,5};
		SockIOPool pool = SockIOPool.getInstance();
		
		pool.setServers(addr);
		pool.setWeights(weight);
		pool.setInitConn(5);
		pool.setMinConn(5);
		pool.setMaxConn(200);
		pool.setMaxIdle(1000*30*30);
		pool.setMaintSleep(30);
		
		//socket param timeout 
		pool.setNagle(false);
		pool.setSocketTO(30);
		pool.setSocketConnectTO(0);
		
		//start 
		pool.initialize();
		
		for(int i  = 0;i<10;i++){
			client.set("test"+i,"test"+i);
		}
		
	}
}

官方的jar包实现了 哈希一致性

也就是说  上面的 two的方法  分别将test0-9 存进了两台mem服务器中

如果其中一台宕机了   获取数据的时候不会影响另外一台

如果没有实现一致哈希的话 就会影响其他服务器 导致所有的数据无法获取

package com.chengxi.memc.test;

import java.io.Serializable;

public class Student implements Serializable {
	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "[id:"+this.id+",name"+this.name+"]";
	}
}

这是实体类 要实现序列化


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值