最近在弄mamcached与Hibernate以及spring集成,在网上找了很多相关资料结果发现都是复制粘贴的,结果一直集成失败。mamcached的安装与启动大家应该都会了吧。现在重点介绍集成。
与spring集成的正确配置是这样的。
<bean id="memcachedPool" class="com.danga.MemCached.SockIOPool"
factory-method="getInstance" init-method="initialize"
destroy-method="shutDown">
<constructor-arg>
<value>memCachedPool</value>
</constructor-arg>
<property name="servers">
<list>
<value>127.0.0.1:11211</value>
<value>127.0.0.1:11220</value>
</list>
</property>
<property name="initConn">
<value>20</value>
</property>
<property name="minConn">
<value>10</value>
</property>
<property name="maxConn">
<value>50</value>
</property>
<property name="maintSleep">
<value>3000</value>
</property>
<property name="nagle">
<value>false</value>
</property>
<property name="socketTO">
<value>3000</value>
</property>
</bean>
<bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient">
<!--多个服务器时必须指定poolName-->
<constructor-arg>
<value>memCachedPool</value>
</constructor-arg>
</bean>
----------------------------------------------------------------
其实本文主要重点还是与Hibernate的集成,让MemCached作为Hibernate的二级缓存。googlecode对Hibernate的MemCached支持jar包与最新的MemCachedClient for java不匹配,因为最新的MemCachedClient for java中有一个方法已经过时,googlecode的集成jar包com.googlecode.hibernate.memcached.dangamemcached.DangaMemcacheClientFactory.class还在调用过时的方法
/** @deprecated */
public void setCompressEnable(boolean paramBoolean)
{
throw new UnsupportedOperationException();
}
调用这个方法就直接抛出异常了。
使用老版本的MemCachedClient for java也是可以的,但是最终我还是选择了com.googlecode.hibernate.memcached.spymemcached.SpyMemcacheClientFactory.class
使用这个spy的集成需要下载几个固定的jar包,spy-2.4.jar,memcached-2.1.jar,hibernate-memcached-1.2.2.jar必须用这三个版本的jar包。其他jar包单独与spring集成倒不会出现问题,与Hibernate的集成会出现各种方法签名问题。网上对于Hibernate集成的配置倒是对的,所以就不介绍了。
配置好了之后,肯定要测试是否有效啊。
先使用MemCachedClient for java的接口获取所有的key
public void testGetAll() {
List<String> list = new ArrayList<String>();
Map<String, Map<String, String>> items = memCachedClient.statsItems();
for (Iterator<String> itemIt = items.keySet().iterator(); itemIt.hasNext();) {
String itemKey = itemIt.next();
Map<String, String> maps = items.get(itemKey);
for (Iterator<String> mapsIt = maps.keySet().iterator(); mapsIt.hasNext();) {
String mapsKey = mapsIt.next();
String mapsValue = maps.get(mapsKey);
if (mapsKey.endsWith("number")) { //memcached key 类型 item_str:integer:number_str
String[] arr = mapsKey.split(":");
int slabNumber = Integer.valueOf(arr[1].trim());
int limit = Integer.valueOf(mapsValue.trim());
Map<String, Map<String, String>> dumpMaps = memCachedClient.statsCacheDump(slabNumber, limit);
for (Iterator<String> dumpIt = dumpMaps.keySet().iterator(); dumpIt.hasNext();) {
String dumpKey = dumpIt.next();
Map<String, String> allMap = dumpMaps.get(dumpKey);
for (Iterator<String> allIt = allMap.keySet().iterator(); allIt.hasNext();) {
String allKey = allIt.next();
list.add(allKey.trim());
}
}
}
}
}
System.out.println(list.size());
}
再使用net.spy.memcached.MemcachedClient的接口
@Test
public void testGet() throws IOException {
/* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */
MemcachedClient mc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
/* 按照key值从memcached中查找缓存,不存在则返回null */
Object b = mc.get("key");
System.out.println(b);
mc.shutdown();
}
建议使用debug模式去查看object的hashtable属性。
总之事实证明集成还是比较成功的。
---------------------------------------------------------------------------------------------------------------------------
private static ApplicationContext applicationContext;
private static MemCachedClient memCachedClient;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
applicationContext=new ClassPathXmlApplicationContext("spring/memcachedclient.bean.xml");
memCachedClient=(MemCachedClient) applicationContext.getBean("memCachedClient");
}
@Test
public void testGet() {
Object object=memCachedClient.get("a");
System.out.println(object);
}
@Test
public void testAdd() {
for(int i=0;i<1000;i++){
memCachedClient.add("a"+i,new Date());
}
}
@Test
public void testSet() {
Boolean result=memCachedClient.set("a","testSet");
System.out.println(result);
}
@Test
public void testReplace() {
Boolean result=memCachedClient.replace("a","testReplace");
System.out.println(result);
}
@Test
public void testDelete() {
Boolean result=memCachedClient.delete("a");
System.out.println(result);
}
@Test
public void testGetAll() {
List<String> list = new ArrayList<String>();
Map<String, Map<String, String>> items = memCachedClient.statsItems();
for (Iterator<String> itemIt = items.keySet().iterator(); itemIt.hasNext();) {
String itemKey = itemIt.next();
Map<String, String> maps = items.get(itemKey);
for (Iterator<String> mapsIt = maps.keySet().iterator(); mapsIt.hasNext();) {
String mapsKey = mapsIt.next();
String mapsValue = maps.get(mapsKey);
if (mapsKey.endsWith("number")) { //memcached key 类型 item_str:integer:number_str
String[] arr = mapsKey.split(":");
int slabNumber = Integer.valueOf(arr[1].trim());
int limit = Integer.valueOf(mapsValue.trim());
Map<String, Map<String, String>> dumpMaps = memCachedClient.statsCacheDump(slabNumber, limit);
for (Iterator<String> dumpIt = dumpMaps.keySet().iterator(); dumpIt.hasNext();) {
String dumpKey = dumpIt.next();
Map<String, String> allMap = dumpMaps.get(dumpKey);
for (Iterator<String> allIt = allMap.keySet().iterator(); allIt.hasNext();) {
String allKey = allIt.next();
list.add(allKey.trim());
}
}
}
}
}
System.out.println(list.size());
}