Memcached簡要說明:html
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊java
===================================================================git
項目構建步驟和簡要說明以下web
下載安裝memcached服務端文件,點擊memcached.exe運行啓動服務器(windows)spring
(參考:http://jingyan.baidu.com/article/5225f26b7ef644e6fb09087a.html)數據庫
搭建maven的web項目,選擇建立maven項目,再選擇maven-archetype-webapp類型建立項目。apache
項目文件結構圖windows
項目主要代碼文件說明api
(1)pom.xml 構建項目的pom文件緩存
(2)applicationContext_memcache.xml spring的memcache配置文件
(3)applicationContext.xml spring的配置文件
(4)memcache.properties memcache緩存的配置文件
(5)UserBean.java
(6)MemcachedService.java memcache緩存封裝接口定義
(7)MemcachedServiceImpl.java memcache緩存封裝接口實現
(8)MemcachedServiceImplTest.java memcache緩存單元測試類
5.項目主要代碼文件說明列表詳情展現
(1)pom.xml 構建項目的pom文件(基於spring mvc項目基礎)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.iboxpay</groupId> <artifactId>memcached</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>test Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.2.8.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.12</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.4.Final</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!-- --> <dependency> <groupId>com.danga</groupId> <artifactId>memcached</artifactId> <version>2.6.6</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> <finalName>test</finalName> </build> </project>
(2)applicationContext_memcache.xml spring的memcache配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <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>${memcache.server}</value> </list> </property> <property name="initConn"> <value>${memcache.initConn}</value> </property> <property name="minConn"> <value>${memcache.minConn}</value> </property> <property name="maxConn"> <value>${memcache.maxConn}</value> </property> <property name="maintSleep"> <value>${memcache.maintSleep}</value> </property> <property name="nagle"> <value>${memcache.nagle}</value> </property> <property name="socketTO"> <value>${memcache.socketTO}</value> </property> </bean> <bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient"> <constructor-arg> <value>memCachedPool</value> </constructor-arg> </bean> </beans>
(3)applicationContext.xml spring的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:memcache.properties</value> <value>classpath:datasource.properties</value> </list> </property> </bean> <bean id="springContextHolder" class="com.iboxpay.settlement.gateway.common.util.SpringContextHolder"/> <bean id="memcachedService" class="com.iboxpay.settlement.gateway.common.cache.remote.MemcachedServiceImpl"/> </beans>
(4)memcache.properties memcache緩存的配置文件
memcache.server=127.0.0.1:11211 memcache.initConn=20 memcache.minConn=10 memcache.maxConn=50 memcache.maintSleep=3000 memcache.nagle=false memcache.socketTO=100
(5)UserBean.java
package com.iboxpay.settlement.gateway.common.vo; import java.io.Serializable; public class UserBean implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { String bean = "{name:"+this.getName()+",age:"+this.getAge()+"}"; return bean; } }
(6)MemcachedService.java memcache緩存封裝接口定義
package com.iboxpay.settlement.gateway.common.cache.remote; public interface MemcachedService { public boolean delete(String key); public void set(String key, Object object); public Object get(String key); public boolean deleteWithType(String key, Class clazz); public void setWithType(String key, Object object); public void setWithType(String key, Object object, Class clazz); public Object getWithType(String key, Class clazz); public Object[] getWithType(String keys[], Class clazz); public void setWithType(String keys[], Class clazz, Object objects[]); }
(7)MemcachedServiceImpl.java memcache緩存封裝接口實現
package com.iboxpay.settlement.gateway.common.cache.remote; import javax.annotation.Resource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Service; import com.danga.MemCached.MemCachedClient; /** * The class MemcachedServiceImpl. * * Description: memcached緩存service實現類 * * @author: liaoxiongjian * @since: 2015年11月21日 上午9:49:06 * @version: $Revision$ $Date$ $LastChangedBy$ * */ @Service("memcachedService") public class MemcachedServiceImpl implements MemcachedService { private static final Log log = LogFactory.getLog(MemcachedServiceImpl.class); private static final long serialVersionUID = 1; @Resource MemCachedClient memCachedClient; public void setMemCachedClient(MemCachedClient memCachedClient) { this.memCachedClient = memCachedClient; // 序列化 if (this.memCachedClient != null) { this.memCachedClient.setPrimitiveAsString(true); } } public boolean delete(String key) { return memCachedClient.delete(key); } public void set(String key, Object object) { if (object != null) memCachedClient.set(key, object); else memCachedClient.delete(key); } public Object get(String key) { return memCachedClient.get(key); } public boolean deleteWithType(String key, Class clazz) { return memCachedClient.delete(getKeyWithType(key, clazz)); } public Object getWithType(String key, Class clazz) { return memCachedClient.get(getKeyWithType(key, clazz)); } public void setWithType(String key, Object object) { memCachedClient.set(getKeyWithType(key, object.getClass()), object); } public void setWithType(String key, Object object, Class clazz) { if (object != null) memCachedClient.set(getKeyWithType(key, clazz), object); else memCachedClient.delete(getKeyWithType(key, clazz)); } protected String getKeyWithType(String key, Class clazz) { return clazz.getSimpleName() + "-" + key; } @Override public Object[] getWithType(String[] keys, Class clazz) { for (int i = 0; i < keys.length; i++) { keys[i] = getKeyWithType(keys[i], clazz); } try { return memCachedClient.getMultiArray(keys); } catch (Exception e) {} return new Object[0]; } @Override public void setWithType(String[] keys, Class clazz, Object[] objects) { for (int i = 0; i < keys.length; i++) { memCachedClient.set(getKeyWithType(keys[i], clazz), objects[i]); } } }
(8)MemcachedServiceImplTest.java memcache緩存單元測試類
package com.iboxpay.test; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import junit.framework.TestCase; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.iboxpay.settlement.gateway.common.cache.remote.MemcachedService; import com.iboxpay.settlement.gateway.common.vo.UserBean; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:applicationContext_memcache.xml"}) public class MemcachedServiceImplTest extends TestCase{ @Resource private MemcachedService memcachedService; @Test public void testSet() { try { // 開始設值 memcachedService.set("name", " string "); memcachedService.set("int", 5); memcachedService.set("double", 5.5); UserBean UserBean = new UserBean(); UserBean.setAge(21); UserBean.setName("名字"); memcachedService.set("UserBean", UserBean); List<UserBean> data = new ArrayList<UserBean>(); for (int i = 0; i < 3; i++) { UserBean xUserBean = new UserBean(); xUserBean.setAge(i); xUserBean.setName("test_" + i); data.add(xUserBean); } memcachedService.set("data", data); //開始取值 String name = (String) memcachedService.get("name"); int i = (Integer) memcachedService.get("int"); double d = (Double) memcachedService.get("double"); UserBean b = (UserBean) memcachedService.get("UserBean"); data = (List<UserBean>) memcachedService.get("data"); System.out.println("字符串:" + name); System.out.println("數字型:" + i); System.out.println("雙精度:" + d); System.out.println("UserBean toString :" + b.toString()); System.out.println("data toString :" + data.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }