`

memcached在java中的运用

阅读更多

服务端使用的 memcached 版本为 memcached-1.4.20,libevent 版本为 libevent-2.0.21-stable

安装方法见 :http://lucien-zzy.iteye.com/blog/2112490

 

一、概念

Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。

采用c编写的一种集中式的cache,支持分布式横向扩展。
memcached服务端本身是单实例的,只是在客户端实现的过程中可以根据存储的主键做分区存储。
内存存储:和cpu消耗高,内存消耗低的应用部署在一起;
集中式缓存:避开了分布式缓存的传播问题,但是需要非单点来保证可靠性,可以将多个memcached
作为一个虚拟的集群。
分布式扩展:采用了可分布式扩展的模式。可以将多个服务端组成一个虚拟的服务端。
socket通信:当前支持tcp和udp两种模式,可以根据客户端的不同使用nio的同步或异步调用方式。
特殊的内存分配机制:支持的最大存储对象为1m。

基于libevent的事件处理

二、适用场合

1.分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。

2.数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用Hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。

3.服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在 不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统服务器呢?这时候,我们便可以使用memcached, 登录系统将登录信息缓存起来,查询系统便可以获得登录信息,就像获取本地信息一样。

三、不适用场合

那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源

 

以下为使用实例

所需jar包:

commons-pool-1.5.6.jar、java_memcached-release_2.6.6.jar、slf4j-api-1.6.1.jar、slf4j-simple-1.6.1.jar

参数配置memcached.properties

initConn=10 //初始连接数  
minConn=10 //最小连接数  
maxConn=20 //最大连接数  
maxIdle=3600000//最大处理时间  
//设置连接池守护线程的睡眠时间 
maintSleep=5000  
//设置TCP参数,连接超时
nagle=false//TCP对于socket创建的算法  
socketTO=3000//socket连接超时时间  
socketConnectTO=0  
//服务器出现问题时的自动修复(相当于事物)  
failover=true  
failback=true  
//心跳检查,确定服务器的状态  
aliveCheck=true  
address=192.168.0.200//memcached服务端开的地址  
port=1225//端口  
weight=1//服务器权重,数量应保持一致  

 

创建工具类

1.基于java_memcached-release_2.6.3

package com.hl.memcached.cache;

import java.util.Date;

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

public class MyCache {
	public static void main(String[] args) {
		MemCachedClient client=new MemCachedClient();
		String [] addr ={"127.0.0.1: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);
		pool.setNagle(false);
		pool.setSocketTO(30);
		pool.setSocketConnectTO(0);
		pool.initialize();
		
//		String [] s  =pool.getServers();
		client.setCompressEnable(true);
		client.setCompressThreshold(1000*1024);
		
//		将数据放入缓存
		client.set("test2","test2");
		
//		将数据放入缓存,并设置失效时间
		Date date=new Date(2000000);
		client.set("test1","test1", date);
		
//		删除缓存数据
//		client.delete("test1");
		
//		获取缓存数据
		String str =(String)client.get("test1");
		System.out.println(str);
	}
}

 

2.   基于alisoft-xplatform-asf-cache-2.5.1

1)  配置memcached.xml

<?xml version="1.0" encoding="UTF-8"?>
<memcached>
	<!-- name 属性是程序中使用Cache的唯一标识;socketpool 属性将会关联到后面的socketpool配置; -->
	<client name="mclient_0" compressEnable="true" defaultEncoding="UTF-8"
		socketpool="pool_0">
		<!-- 可选,用来处理出错情况 -->
		<errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler
		</errorHandler>
	</client>

	<!--
		name 属性和client 配置中的socketpool 属性相关联。
		maintSleep属性是后台线程管理SocketIO池的检查间隔时间,如果设置为0,则表明不需要后台线程维护SocketIO线程池,默认需要管理。
		socketTO 属性是Socket操作超时配置,单位ms。 aliveCheck
		属性表示在使用Socket以前是否先检查Socket状态。
	-->
	<socketpool name="pool_0" maintSleep="5000" socketTO="3000"
		failover="true" aliveCheck="true" initConn="5" minConn="5" maxConn="250"
		nagle="false">
		<!-- 设置memcache服务端实例地址.多个地址用","隔开 -->
		<servers>127.0.0.1:11211</servers>
		<!--
			可选配置。表明了上面设置的服务器实例的Load权重. 例如 <weights>3,7</weights> 表示30% load 在
			10.2.224.36:33001, 70% load 在 10.2.224.46:33001
		
		<weights>3,7</weights>
		-->
	</socketpool>
</memcached>

 测试

package com.hl.memcached.client.test;

import java.util.ArrayList;
import java.util.List;

import com.alisoft.xplatform.asf.cache.ICacheManager;
import com.alisoft.xplatform.asf.cache.IMemcachedCache;
import com.alisoft.xplatform.asf.cache.memcached.CacheUtil;
import com.alisoft.xplatform.asf.cache.memcached.MemcachedCacheManager;
import com.hl.memcached.cache.client.TestBean;

public class ClientTest {
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		ICacheManager<IMemcachedCache> manager;
		manager = CacheUtil.getCacheManager(IMemcachedCache.class,
				MemcachedCacheManager.class.getName());
		manager.setConfigFile("memcached.xml");
		manager.start();
		try {
			IMemcachedCache cache = manager.getCache("mclient_0");
			cache.put("key", "value");
			System.out.println(cache.get("key"));
		} finally {
			manager.stop();
		}
	}

}

 

使用memcached缓存java bean自定义对象

Memcached可以缓存String,也可以缓存自定义java bean。但必须是可序列化的java beanimplements Serializable即可)

1.         基于java_memcached-release_2.6.3

测试用java bean

package com.hl.memcached.cache.client;

import java.io.Serializable;

public class TestBean implements Serializable{
	private static final long serialVersionUID = 5344571864700659321L;
	
	private String name;
	private Integer age;
	//get、set方法略
}

 

MyCache.java 代码

package com.hl.memcached.cache;

import java.util.Date;

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

public class MyCache {
	public static void main(String[] args) {
		MemCachedClient client=new MemCachedClient();
		String [] addr ={"127.0.0.1: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);
		pool.setNagle(false);
		pool.setSocketTO(30);
		pool.setSocketConnectTO(0);
		pool.initialize();
		
//		String [] s  =pool.getServers();
		client.setCompressEnable(true);
		client.setCompressThreshold(1000*1024);
		
//		将数据放入缓存
		TestBean bean=new TestBean();
		bean.setName("name1");
		bean.setAge(25);
		client.add("bean1", bean);
		
//		获取缓存数据
		TestBean beanClient=(TestBean)client.get("bean1");
		System.out.println(beanClient.getName());
	}
}

 

 

2.         基于alisoft-xplatform-asf-cache-2.5.1

package com.hl.memcached.client.test;

import java.util.ArrayList;
import java.util.List;

import com.alisoft.xplatform.asf.cache.ICacheManager;
import com.alisoft.xplatform.asf.cache.IMemcachedCache;
import com.alisoft.xplatform.asf.cache.memcached.CacheUtil;
import com.alisoft.xplatform.asf.cache.memcached.MemcachedCacheManager;
import com.hl.memcached.cache.client.TestBean;

public class ClientTest {
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		ICacheManager<IMemcachedCache> manager;
		manager = CacheUtil.getCacheManager(IMemcachedCache.class,
				MemcachedCacheManager.class.getName());
		manager.setConfigFile("memcached.xml");
		manager.start();
		try {
			IMemcachedCache cache = manager.getCache("mclient_0");

			TestBean bean=new TestBean();
			bean.setName("name1");
			bean.setAge(25);
			cache.put("bean", bean);
			TestBean beanClient=(TestBean)cache.get("bean");
			System.out.println(beanClient.getName());
			
			List<TestBean> list=new ArrayList<TestBean>();
			list.add(bean);
			cache.put("beanList", list);
			List<TestBean> listClient=(List<TestBean>)cache.get("beanList");
			if(listClient.size()>0){
				TestBean bean4List=listClient.get(0);
				System.out.println(bean4List.getName());
			}
		} finally {
			manager.stop();
		}
	}

}

 参考资料

http://www.infoq.com/cn/articles/memcached-java

http://my249645546.iteye.com/blog/1420061

 

 优化
1. 尽量使用小容量的数据内容.
2. 增加memcached提高服务获取的内存总量、提高命中率。
3. 可以采用多个memcache服务进行侦听,分开处理,针对服务提供的频繁度划分服务内存
4. 根据服务器的性能不同设置权重 weights
5. 对需要使用memcache服务的机器ip,服务端做访问限制。
避免memcached里的数据不会被别有心意的人再利用,或责保证服务器的内存不被漫天遍地的垃圾数据所堆积,造成命中极低
6. 优化memcached客户端的代码。
synchronized 的问题
java memcached client源文件的大量方法里面都直接使用 synchronized 如 getConnection(), checkin() 等,而SockIOPool类似一个Singleton, 因此造成多线程失去了意义。同时 synchronized 方法里面又大量使用了 Hashtable 等synchronized保护的集合类。

 

0
0
分享到:
评论

相关推荐

    memcached在JAVA项目中的应用.docx

    memcached在JAVA项目中的应用

    Java 配置Memcached 应用详解

    Java 配置Memcached 应用详解

    memcached的三种java客户端jar

    较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。 2.spymemcached,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报time...

    Java环境下Memcached应用详解.docx

    本文档主要讲述的是Java环境下Memcached应用详解;...Memcached主要是集群环境下的缓存解决方案,可以运行在Java或者.NET平台上,这里我们主要讲的是Windows下的Memcached应用。希望本文档会给有需要的朋友带来帮助;

    memcached安装及java应用使用memcached

    NULL 博文链接:https://da-zhuang.iteye.com/blog/2234078

    java_memcached-release_2.5.1

    这次主要的优化工作还是在三个方面:应用服务器(Apache,JBoss)配置,业务流程,Cache Client包(http://code.google.com/p/memcache-client-forjava/ )。这里把过去和这次优化对于Cache的使用作一个经验分享,...

    MemCached-在Widnows环境下的Java之简单应用.docx

    MemCached-在Widnows环境下的Java之简单应用.docx

    memcached 服务端以及memcached.jar

    Memcached 是一个高性能的分布式内存对象缓存...Memcached需要有缓存服务端,采用java编程的话还需要memcached.jar,这就是java中实现memcached服务的插件。这里服务端和jar包都放在一起了,希望能方便大家学习哈~~~

    memcached1

    Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万...

    java环境下Memcached应用详解

    讲述的是在java环境下进行使用内存缓存技术的一些实现手段

    memcached-1.6.0_beta1.tar.gz

    memcached-1.6.0_beta1.tar.gz,缓存memcached的应用,这个是在JAVA中使用的

    Java的开源高性能memcached客户端XMemcached.zip

    Xmemcached是基于java nio实现的高性能可扩展的memcached客户端。它的主要特点: 高性能,稳定可靠,已经在众多公司的众多项目里得到应用。 功能完备:客户端分布式、权重、最新最完整的协议支持。 ...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    memcached全面剖析.zip

    memcached全面剖析, 密码 1234!@#$ memcached完全剖析–1. memcached的基础 memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3.... memcached的应用和兼容程序 可关注公众号:Java与大数据进阶

    java开源包4

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包101

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包11

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包6

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包9

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

Global site tag (gtag.js) - Google Analytics