Xmemcached使用之与Spring整合
- - 互联网 - ITeye博客clerk-memcached.xml中代码如下:. . . 服务器列表,格式:ip:port. 主机映射:host1对应1号、host2对应2号... Session 分配器,有自带的,影响分布式. memcachedconf.properties中的代码如下.
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>1.4.3</version>
<type>pom</type>
</dependency>
项目启动配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:memcachedconf.properties</value> </list> </property> </bean> <import resource="classpath:spring/clerk-memcached.xml"/> </beans>
clerk-memcached.xml中代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--xmemcached 配置--> <bean name="xmemcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> <property name="servers" value="${memcached.servers}"/> <property name="weights"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <property name="connectionPoolSize" value="${memcached.connectionPoolSize}"/> <property name="sessionLocator"> <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"/> </property> <property name="transcoder"> <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder"/> </property> <property name="bufferAllocator"> <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"/> </property> <property name="failureMode" value="true"/> </bean> <!--简单封装的memcached客户端--> <bean name="memcachedClient" class="com.si.util.Memcached"> <property name="isOpen" value="${memcached.isOpen}"/> <property name="expires" value="${memcached.expires}"/> <property name="memcachedClient" ref="xmemcachedClient"/> </bean> </beans>
其中各参数的意义:
参数 |
含义 |
servers |
服务器列表,格式:ip:port |
weights |
主机映射:host1对应1号、host2对应2号.. |
sessionLocator |
Session 分配器,有自带的,影响分布式 |
transcoder |
通信编码方式 |
bufferAllocator |
缓冲区分配器 |
memcachedconf.properties中的代码如下
#memcached开关 memcached.isOpen=true #过期时间15分钟,单位(秒) memcached.expires=3600 #memcached服务器列表 memcached.servers=host1:port1 host2:port2 #memcached 连接池大小 memcached.connectionPoolSize=30
com.si.clerk.util.Memcached的java类代码
package com.si.util; import net.rubyeye.xmemcached.MemcachedClient; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.*; public class Memcached { private static Log log = LogFactory.getLog(Memcached.class); private boolean isOpen; // Memcached 开关 private int expires; // 默认过期时间 private MemcachedClient mc; /* add 仅当存储空间中不存在键相同的数据时才保存 */ public <T> void addWithNoReply(String key, T value) { this.addWithNoReply(key, expires, value); } /** * 设置键值对 * @param key key * @param expires 单位:秒,0 表示永不过期 * @param value 必须是一个可序列化的对象, 可以是容器类型如:List,但容器里面保存的对象必须是可序列化的 */ public <T> void addWithNoReply(String key, int expires, T value) { if (StringUtil.isEmpty(key)) return; try { if (isOpen && mc != null) { mc.addWithNoReply(key, expires, value); } } catch(Exception e) { log.error(e.getMessage(), e); } } /* set 无论何时都保存 */ public <T> void set(String key, T value) { this.set(key, expires, value); } /** * 设置键值对 * @param key key * @param expires 单位:秒,0 表示永不过期 * @param value 必须是一个可序列化的对象, 可以是容器类型如:List,但容器里面保存的对象必须是可序列化的 */ public <T> void set(String key, int expires, T value) { if (StringUtil.isEmpty(key)) return; try { if (isOpen && mc != null) { mc.set(key, expires, value); } } catch(Exception e) { log.error(e.getMessage(), e); } } /** * 根据key获得值 * @param key key * @return value */ public <T> T get(String key) { try { if (!StringUtil.isEmpty(key) && isOpen && mc != null) { return (T)mc.get(key); } } catch(Exception e) { log.error(e.getMessage(), e); } return null; } /** * 给每个原始key加上前缀后,再查。 * @param keys 原始key * @param memcachedKeyPrefix 前缀 * @return */ public <T> Map<String, T> getMulti(Collection keys, String memcachedKeyPrefix) { if (CommonTools.isEmpty(keys)) return null; if ("".equals(memcachedKeyPrefix)) { return this.get(keys); } List<String> strList = new ArrayList<String>(); for (Object key : keys) { strList.add(memcachedKeyPrefix + String.valueOf(key)); } return this.get(strList); } /** * 重载方法 * @param keys * @param <T> * @return */ public <T> Map<String, T> getMulti(Collection keys) { return getMulti(keys, ""); } /** * 批量获取 * @param keys keys * @return valueMap */ private <T> Map<String, T> get(Collection<String> keys) { Map<String, T> map = null; try { if (keys != null && isOpen && mc != null) { map = mc.get(keys); } } catch(Exception e) { log.error(e.getMessage(), e); } return map; } public void setIsOpen(boolean open) { isOpen = open; } public void setExpires(int expires) { this.expires = expires; } public void setMemcachedClient(MemcachedClient mc) { this.mc = mc; } }