Memcached(三)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机制
         结合本地缓存

3种客户端的使用,建议使用呢xmemcached。

4.淘宝客户端(针对官方给出的 memcached client for java进行二次包装)
   4.1 我们使用的这个缓存,将来可能会换掉 所以直接使用API可能导致
        将来扩展性很差,所以要做适配器隔离(适配器模式)--->提炼接口
   4.2 把硬编码初始化的方式,改成配置文件的方式
   4.3 Memcached一旦断电、重启等都会导致该实例数据丢失
         ,即便用了一致hash,也只保证了其它实例数据不受影响。
     淘宝提供了Cluster机制(做了备份)
    4.4 为了减轻Memached的压力,也可以结合本地缓存一起使用
    -------------------------------------------------------------------------
    到此为止应该能够提供性能,实际应用时发现性能提高不是很明显
    4.5 memcached client for java啊中很多代码都是用
         了很多同步块、用的阻塞式的IO,
     重新优化,用java5 线程池框架中提供的机制用NIO模式重新包装
    4.6 源代码中读取数据时是单字节操作的,改成批量缓存读取。


 

  • MemcachedDemo1: 显示Memcached的设置,链接,存储,取值!(因为我的环境是在虚拟机里,注意需要关闭防火墙,否则打印是null,linux关闭防火墙:service iptables stop,关闭防火墙开机启动 chkconfig iptables off)
package com.drh;

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

public class MemcachedDemo1 {

	public static void main(String[] args) {
		MemCachedClient client = new MemCachedClient();
		String[] addr = {"192.168.254.131:11211"};
		Integer[] weights = {3};
		SockIOPool pool = SockIOPool.getInstance();
		
		pool.setServers(addr);
		pool.setWeights(weights);
		pool.setInitConn(5);
		pool.setMinConn(5);
		pool.setMinConn(200);
		pool.setMaxIdle(1000*30*30);
		pool.setMaintSleep(30);
		
		pool.setNagle(false);
		pool.setSocketTO(30);
		pool.setSocketConnectTO(0);
		
		pool.initialize();
//		client.set("test1", "test1");
		System.out.println(client.get("test1"));
		
	}

}




  • MemcachedDemo2:显示一台服务器同时开2个Memcached服务器时,这时循环存10个值
package com.drh;

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

public class MemcachedDemo2 {

	public static void main(String[] args) {
		MemCachedClient client = new MemCachedClient();
		String[] addr = {"192.168.154.131:11211","192.168.154.131:11212"};
		Integer[] weights = {5,5};
		SockIOPool pool = SockIOPool.getInstance();
		
		pool.setServers(addr);
		pool.setWeights(weights);
		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);
		
		pool.initialize();
		
		//client.set("test1", "test1");
		//System.out.println(client.get("test1"));
		for(int i = 0; i < 10;i++){
//			client.set("test"+i,"test"+i);
			System.out.println(client.get("test"+i));
		}
		
		
	}

}


总结:执行发现2台服务器分别都有数据,这是去数据没问题,10个都可以取到,但是现在停掉一个memcached,这是在for取值,发现部分有值,部分是null

  • MemcachedDemo3:存储对象
package com.drh;

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

public class MemcachedDemo3 {

    public static void main(String[] args) {
        MemCachedClient client = new MemCachedClient();
        String[] addr = {"192.168.254.131:11211"};
        Integer[] weights = {3};
        SockIOPool pool = SockIOPool.getInstance();
        
        pool.setServers(addr);
        pool.setWeights(weights);
        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);
        
        pool.initialize();
        
        Student stu = new Student();
        stu.setName("zhangsan");
        stu.setAge(12);
        //client.add("stu1",stu);
        Student stu1 = (Student)client.get("stu1");
        System.out.println(stu1);
        
        
    }

}



注:实体对象必须实现 Serializable



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值