初めてmemcachedに会います

8446 ワード

回転:http://my249645546.iteye.com/blog/1420061
一、概念
Memcachedは、動的システムにおけるデータベース負荷を低減し、性能を向上させるために、danga.com(LiveJournalを運営する技術チーム)が開発した分散型メモリオブジェクトキャッシュシステムのセットである.
二、適用の場合
1.分散アプリケーション.memcached自体は分散システムに基づいているので、特に大きな分散システムに適しています.
2.データベースの前段キャッシュ.データベースはよくウェブサイトのシステムのボトルネックです.データベースの大合併量のアクセスは、しばしばウェブサイトのメモリのオーバーフローを引き起こす.もちろん、私たちはヒップホップのキャッシュメカニズムを使用することもできます.しかし、memcachedは分散式に基づいており、サイト自体から独立して適用できるので、大きなウェブサイトのアプリケーションの分割に適しています.
3.サーバ間データ共有.例えば、私達はウェブサイトの登録システム、クエリシステムを二つのアプリケーションに分割して、異なるサーバに置いて、クラスタ化します.この時、ユーザがログインした後、ログイン情報はどうやってログインシステムサーバからクエリシステムサーバに同期しますか?この時、私達はmemcachedを使うことができて、登録システムは登録情報をキャッシュして、検索システムは登録情報を獲得することができて、現地の情報を獲得するようです.
三、適用されない場合
これらは「分布」が必要ではなく、共有が必要ではない、あるいは単にサーバ1台のアプリケーションまで規模が小さい、memcachedはいかなる利点も持ってこない、逆にシステムの効率を遅くしてしまう.ネットワーク接続にも資源が必要だからだ.
四、据え付け
ここではwindows環境のインストールを紹介します.
1.memcacheのwindows安定版をダウンロードして、解凍してあるディスクの下に置いて、たとえばc:\memcachedです.
2.cmdで'c:\memcached\memcached.exe-d install'を入力してインストールします.
3.再入力:'c:\memcached\memcached.exe-d start'が起動します.
以後、memcachedはwindowsのサービスとして起動するたびに自動的に起動します.これでサーバー側のインストールが完了しました.
五、クライアント
Memcached自体はCを使用して開発されたもので、クライアントはphp、C〓、またはjavaとすることができる.私はjavaを作ったので、ここではjavaベースのクライアントだけを紹介します.
私はネットでjavaベースのクライアントが二つあるのを見ました.
1.java_memcached-release_2.6.3
1)概要
これは一般的なMemcachedクライアントフレームです.具体的なオリジナルは不明です.
2)依存のjar
A.commons-pool-1.5.jar
B.java_memcached-release_2.6.3.jar
C.slaf 4 j-appi-1.6.1.jar
D.slaf 4 j-simple-1.6.1.jar
2.alisoff-xplotform-asf-cache-23.5.1
1)概要
このドンドンはアリソフトのストラクチャー岑文初がパッケージ化しました.中のコメントは全部中国語の方がいいです.
2)依存のjar
A.alisoff-xplotform-asf-cache-2.5.1.jar
B.commons-loging-1.0.4.jar
C.hessian-3.01.jar
D.log 4 j-1.2.jar
E.stax-appi-1.0.1.jar
F.wwstx-asl-2.4.2.jar
六、パラダイム
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.   alisoff-xplotform-asf-cacheに基づく
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>
2)試験類
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 beanでなければなりません.
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.         
ベース
alisoff-xplotform-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://blog.developers.api.sina.com.cn/?p=124
http://www.infoq.com/cn/articles/memcached-java