windows下的Server端很简单,不用安装,双击运行后默认服务端口是11211,没有试着去更改端口,因为反正以后会用unix版本,到时再记录安装步骤。下载客户端的javaAPI包,接口非常简单,参考API手册上就有现成的例子。ITPUB个人空间T {]:eJ
ITPUB个人空间E&bH8\[a'U!w
目标,对旧框架缓存部分进行改造:ITPUB个人空间5W%M8YRw:z:~
1、缓存工具类
:Ob F6IG)K2I02、hibernate的provider
t*G,iKxRK03、用缓存实现session机制
"{ CY t:g1jyn0
u v0W1}}5x0今天先研究研究缓存工具类的改造,在旧框架中部分函数用了ehcache对执行结果进行了缓存处理,现在目标是提供一个缓存工具类,在配置文件中配置使用哪种缓存(memcached或ehcached),使其它程序对具体的缓存不依赖,同时使用AOP方式来对方法执行结果进行缓存。
E!U~CQ%H8N?&T.Y0首先是工具类的实现:ITPUB个人空间bp%@3Ef iZ#Z
在Spring中配置
g~'d%q`*d?_0
Java代码
<!-- EhCache Manager -->
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation">
<value>classpath:ehcache.xml</value>
</property>
</bean>
<bean id="localCache"
class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager" ref="cacheManager" />
<property name="cacheName"
value="×××.cache.LOCAL_CACHE" />
</bean>
<bean id="cacheService"
class="×××.core.cache.CacheService" init-method="init" destroy-method="destory">
<property name="cacheServerList" value="${cache.servers}"/>
<property name="cacheServerWeights" value="${cache.cacheServerWeights}"/>
<property name="cacheCluster" value="${cache.cluster}"/>
<property name="localCache" ref="localCache"/>
</bean>
<!-- EhCache Manager -->
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation">
<value>classpath:ehcache.xml</value>
</property>
</bean>
<bean id="localCache"
class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager" ref="cacheManager" />
<property name="cacheName"
value="×××.cache.LOCAL_CACHE" />
</bean>
<bean id="cacheService"
class="×××.core.cache.CacheService" init-method="init" destroy-method="destory">
<property name="cacheServerList" value="${cache.servers}"/>
<property name="cacheServerWeights" value="${cache.cacheServerWeights}"/>
<property name="cacheCluster" value="${cache.cluster}"/>
<property name="localCache" ref="localCache"/>
</bean>在properties文件中配置${cache.servers} ${cache.cacheServerWeights} ${cache.cluster}
YYPGx'r!cH$SQ0具体工具类的代码ITPUB个人空间 _ A+n/g b~"y(E
Java代码
/**
* @author Marc
*
*/
public class CacheService {
private Log logger = LogFactory.getLog(getClass());
private Cache localCache;
String cacheServerList;
String cacheServerWeights;
boolean cacheCluster = false;
int initialConnections = 10;
int minSpareConnections = 5;
int maxSpareConnections = 50;
long maxIdleTime = 1000 * 60 * 30; // 30 minutes
long maxBusyTime = 1000 * 60 * 5; // 5 minutes
long maintThreadSleep = 1000 * 5; // 5 seconds
int socketTimeOut = 1000 * 3; // 3 seconds to block on reads
int socketConnectTO = 1000 * 3; // 3 seconds to block on initial
// connections. If 0, then will use blocking
// connect (default)
boolean failover = false; // turn off auto-failover in event of server
// down
boolean nagleAlg = false; // turn off Nagle's algorithm on all sockets in
// pool
MemCachedClient mc;
public CacheService(){
mc = new MemCachedClient();
mc.setCompressEnable(false);
}
/**
* 放入
*
*/
public void put(String key, Object obj) {
Assert.hasText(key);
Assert.notNull(obj);
Assert.notNull(localCache);
if (this.cacheCluster) {
mc.set(key, obj);
} else {
Element element = new Element(key, (Serializable) obj);
localCache.put(element);
}
}
/**
* 删除
*/
public void remove(String key){
Assert.hasText(key);
Assert.notNull(localCache);
if (this.cacheCluster) {
mc.delete(key);
}else{
localCache.remove(key);
}
}
/**
* 得到
*/
public Object get(String key) {
Assert.hasText(key);
Assert.notNull(localCache);
Object rt = null;
if (this.cacheCluster) {
rt = mc.get(key);
} else {
Element element = null;
try {
element = localCache.get(key);
} catch (CacheException cacheException) {
throw new DataRetrievalFailureException("Cache failure: "
+ cacheException.getMessage());
}
if(element != null)
rt = element.getValue();
}
return rt;
}
/**
* 判断是否存在
*
*/
public boolean exist(String key){
Assert.hasText(key);
Assert.notNull(localCache);
if (this.cacheCluster) {
return mc.keyExists(key);
}else{
return this.localCache.isKeyInCache(key);
}
}
private void init() {
if (this.cacheCluster) {
String[] serverlist = cacheServerList.split(",");
Integer[] weights = this.split(cacheServerWeights);
// initialize the pool for memcache servers
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(serverlist);
pool.setWeights(weights);
pool.setInitConn(initialConnections);
pool.setMinConn(minSpareConnections);
pool.setMaxConn(maxSpareConnections);
pool.setMaxIdle(maxIdleTime);
pool.setMaxBusyTime(maxBusyTime);
pool.setMaintSleep(maintThreadSleep);
pool.setSocketTO(socketTimeOut);
pool.setSocketConnectTO(socketConnectTO);
pool.setNagle(nagleAlg);
pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);
pool.initialize();
logger.info("初始化memcached pool!");
}
}
private void destory() {
if (this.cacheCluster) {
SockIOPool.getInstance().shutDown();
}
}
}
/**
* @author Marc
*
*/
public class CacheService {
private Log logger = LogFactory.getLog(getClass());
private Cache localCache;
String cacheServerList;
String cacheServerWeights;
boolean cacheCluster = false;
int initialConnections = 10;
int minSpareConnections = 5;
int maxSpareConnections = 50;
long maxIdleTime = 1000 * 60 * 30; // 30 minutes
long maxBusyTime = 1000 * 60 * 5; // 5 minutes
long maintThreadSleep = 1000 * 5; // 5 seconds
int socketTimeOut = 1000 * 3; // 3 seconds to block on reads
int socketConnectTO = 1000 * 3; // 3 seconds to block on initial
// connections. If 0, then will use blocking
// connect (default)
boolean failover = false; // turn off auto-failover in event of server
// down
boolean nagleAlg = false; // turn off Nagle's algorithm on all sockets in
// pool
MemCachedClient mc;
public CacheService(){
mc = new MemCachedClient();
mc.setCompressEnable(false);
}
/**
* 放入
*
*/
public void put(String key, Object obj) {
Assert.hasText(key);
Assert.notNull(obj);
Assert.notNull(localCache);
if (this.cacheCluster) {
mc.set(key, obj);
} else {
Element element = new Element(key, (Serializable) obj);
localCache.put(element);
}
}
/**
* 删除
*/
public void remove(String key){
Assert.hasText(key);
Assert.notNull(localCache);
if (this.cacheCluster) {
mc.delete(key);
}else{
localCache.remove(key);
}
}
/**
* 得到
*/
public Object get(String key) {
Assert.hasText(key);
Assert.notNull(localCache);
Object rt = null;
if (this.cacheCluster) {
rt = mc.get(key);
} else {
Element element = null;
try {
element = localCache.get(key);
} catch (CacheException cacheException) {
throw new DataRetrievalFailureException("Cache failure: "
+ cacheException.getMessage());
}
if(element != null)
rt = element.getValue();
}
return rt;
}
/**
* 判断是否存在
*
*/
public boolean exist(String key){
Assert.hasText(key);
Assert.notNull(localCache);
if (this.cacheCluster) {
return mc.keyExists(key);
}else{
return this.localCache.isKeyInCache(key);
}
}
private void init() {
if (this.cacheCluster) {
String[] serverlist = cacheServerList.split(",");
Integer[] weights = this.split(cacheServerWeights);
// initialize the pool for memcache servers
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(serverlist);
pool.setWeights(weights);
pool.setInitConn(initialConnections);
pool.setMinConn(minSpareConnections);
pool.setMaxConn(maxSpareConnections);
pool.setMaxIdle(maxIdleTime);
pool.setMaxBusyTime(maxBusyTime);
pool.setMaintSleep(maintThreadSleep);
pool.setSocketTO(socketTimeOut);
pool.setSocketConnectTO(socketConnectTO);
pool.setNagle(nagleAlg);
pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);
pool.initialize();
logger.info("初始化memcachedpool!");
}
}
private void destory() {
if (this.cacheCluster) {
SockIOPool.getInstance().shutDown();
}
}
}ITPUB个人空间~+v]^8QWHQ!J
然后实现函数的AOP拦截类,用来在函数执行前返回缓存内容ITPUB个人空间L9a m{em0w
Java代码
public class CachingInterceptor implements MethodInterceptor {
private CacheService cacheService;
private String cacheKey;
public void setCacheKey(String cacheKey) {
this.cacheKey = cacheKey;
}
public void setCacheService(CacheService cacheService) {
this.cacheService = cacheService;
}
public Object invoke(MethodInvocation invocation) throws Throwable {
Object result = cacheService.get(cacheKey);
//如果函数返回结果不在Cache中,执行函数并将结果放入Cache
if (result == null) {
result = invocation.proceed();
cacheService.put(cacheKey,result);
}
return result;
}
}
public class CachingInterceptor implements MethodInterceptor {
private CacheService cacheService;
private String cacheKey;
public void setCacheKey(String cacheKey) {
this.cacheKey = cacheKey;
}
public void setCacheService(CacheService cacheService) {
this.cacheService = cacheService;
}
public Object invoke(MethodInvocation invocation) throws Throwable {
Object result = cacheService.get(cacheKey);
//如果函数返回结果不在Cache中,执行函数并将结果放入Cache
if (result == null) {
result = invocation.proceed();
cacheService.put(cacheKey,result);
}
return result;
}
}Spring的AOP配置如下:
6P$^g5[&@X]'Y0
Java代码
<aop:config proxy-target-class="true">
<aop:advisor
pointcut="execution(* ×××.PoiService.getOne(..))"
advice-ref="PoiServiceCachingAdvice" />
</aop:config>
<bean id="BasPoiServiceCachingAdvice"
class="×××.core.cache.CachingInterceptor">
<property name="cacheKey" value="PoiService" />
<property name="cacheService" ref="cacheService" />
</bean>
分享到:
相关推荐
《Java与Memcached整合详解——基于Memcached-Java-Client 2.6.1》 在现代Web开发中,缓存技术是提升系统性能的重要手段之一。Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于缓解数据库负载,提高响应...
在Linux环境下,可以通过包管理器(如apt-get或yum)安装Memcached。安装完成后,需要启动服务,并可以通过命令行工具`memcached`进行配置,例如设置监听端口、最大内存等参数。 ### 3. 使用Memcached进行缓存操作 ...
**Memcached 使用详解** Memcached 是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高网站性能。它通过在内存中存储数据,为应用程序提供快速的数据访问,避免了频繁读取...
总的来说,Memcached是提高Web应用性能的有效工具,通过理解其工作原理、合理配置和运用最佳实践,可以在许多场景下发挥出巨大的价值。不过,需要注意的是,虽然它能显著提升性能,但并不适用于所有情况,对于需要...
**Memcached 缓存插件详解** Memcached 是一款高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高数据访问速度。它通过将数据存储在内存中,使得数据检索时间大大减少,从而提高了...
**Memcached缓存技术详解** Memcached是一款高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用于减轻...在实际项目中,结合业务需求和系统架构,灵活运用Memcached能显著优化系统性能,降低数据库负载。
**memcached缓存服务器详解** Memcached是一款高性能、分布式内存对象缓存系统,它...通过理解和熟练运用Memcached,开发者可以构建更高效、更响应迅速的应用,尤其是在高并发、大数据量的场景下,其价值更为突出。
- **其他语言支持**:Memcached还支持Python、Java、Ruby、C++等多种语言的客户端,方便不同环境下的开发。 4. **最佳实践** - **缓存策略**:合理设置TTL,避免数据过于频繁地在数据库和缓存之间切换。 - **...
虽然本指南主要关注Java环境下的Xmemcached,但值得一提的是,C#也有类似的Memcached客户端库,如EnyimMemcached,它们同样提供高效的数据缓存功能。对于跨平台应用,理解不同语言下的Memcached客户端用法,有助于...
【Java OA 办公系统详解】 ...请注意,OA系统的开发是一个复杂的过程,涉及到多个技术层面的综合运用,需要开发者具备扎实的Java基础和良好的编程习惯,同时也需要理解企业业务流程,才能设计出符合实际需求的OA系统。
1. **安装**:在Linux环境下,可以通过包管理器如`apt-get`或`yum`安装。在Windows上,可以下载预编译的二进制文件。 2. **启动与停止**:启动Memcached服务通常使用命令行工具,例如在Unix-like系统中,使用`...
理解和熟练运用线程池、锁机制、并发容器(如ConcurrentHashMap)以及并发工具类(如CountDownLatch、CyclicBarrier)是每个Java开发者必备的技能。 “中间件”是指位于操作系统和应用软件之间的软件层,它为构建...
【Java面试核心知识点详解】 Java面试是检验开发者技术深度与广度的重要环节,涵盖了许多关键领域,如JVM优化、微服务、并发编程、Spring框架以及分布式系统等。以下是对这些核心领域的详细解读: 1. **JVM优化**...
### EHCache详解 #### 一、EHCache简介与特点 **1.1 背景** 随着现代软件系统的复杂度不断提高,对数据处理速度的要求也越来越高。为了减轻数据库的负担并提升应用程序性能,缓存技术成为了不可或缺的一部分。...
**Memcached 演示项目详解** Memcached 是一个高性能、分布式的内存对象缓存系统,广泛用于减轻数据库负载,提高Web应用的响应速度。它将数据存储在内存中,以便快速检索,特别适合处理高并发场景下的数据访问。本...
在Linux环境下,可以使用包管理器(如apt或yum)安装Memcached。配置文件通常位于/etc/memcached.conf,可以设置监听端口、最大内存、超时时间等参数。 **编程接口** Memcached提供了多种语言的客户端库,如PHP、...
ehCache更适合于Java应用,集成方便,而Memcached和Redis支持多种语言,且在分布式环境下表现更优秀。选择哪种工具取决于具体项目需求。 总结,ehCache作为一款强大的Java缓存框架,通过高效地管理内存和磁盘存储,...
通过分析这些代码,可以学习到如何在实际环境中应用Java进行云服务的开发,例如Spring Boot、MyBatis等框架的使用,以及Docker、Kubernetes等容器化技术的集成。 在深入学习这个项目时,我们需要关注以下几个关键点...
【JSP房屋系统源代码详解】 JSP(JavaServer Pages)是一种基于Java技术的动态网页开发工具,它允许开发者在HTML、XML或者其他标记语言...同时,这也是一种实践性学习,能够更好地理解和运用Java Web开发的各个方面。
【Apache + Tomcat 负载平衡设置详解】 在高流量的Web应用环境中,单一的服务器可能无法满足处理请求的需求,这时就需要通过负载均衡技术来分散服务器的压力。Apache与Tomcat的结合使用,可以实现高效的负载均衡...