Spring整合xmemcached过程

XMemcached是一个基于Java nio的memcached客户端。

它是线程安全,结构简单,支持所有的memcached文本协议和二进制协议,并且有比较优异的性能表现。还支持一些高级特性,如JMX、动态增删节点、客户端统计以及nio连接池等。

整合开始前,先确认有一个或多个可用的Memcached服务,XMemcached支持集群及服务的权重配置。

文章参考:

1. http://code.google.com/p/xmemcached/

2. http://code.google.com/p/xmemcached/wiki/Spring_Integration

1. 项目使用maven管理,那么请在pom.xml里边添加Xmemcached的依赖包:

1 <dependency
2     <groupId>com.googlecode.xmemcached</groupId>
3     <artifactId>xmemcached</artifactId>
4     <version>1.4.1</version>
5 </dependency>

2. 添加bean配置,自动装载到容器

 1 <bean id="propertyHolder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 2         <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
 3         <property name="ignoreResourceNotFound" value="true" />
 4         <property name="locations">
 5             <list>
 6                 <value>classpath:conf/system.properties</value>
 7                 <value>classpath:conf/jdbc.properties</value>
 8                 <value>classpath:conf/memcached.properties</value>
 9             </list>
10         </property>
11 </bean>
12
13 <bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
14         <constructor-arg>
15             <list>
16                 <bean class="java.net.InetSocketAddress">
17                     <constructor-arg>
18                             <value>${memcached.server.host}</value>
19                     </constructor-arg>
20                     <constructor-arg>
21                             <value>${memcached.server.port}</value>
22                     </constructor-arg>
23                 </bean>
24             </list>
25         </constructor-arg>
26         <constructor-arg>
27             <list>
28                 <value>${memcached.server.weight}</value>
29             </list>
30         </constructor-arg>
31         <property name="connectionPoolSize" value="${memcached.connectionPoolSize}" />
32         <property name="commandFactory">
33                 <bean class="net.rubyeye.xmemcached.command.TextCommandFactory"></bean>
34         </property>
35         <property name="sessionLocator">
36                 <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
37         </property>
38         <property name="transcoder">
39                 <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
40         </property>
41 </bean>
42 <bean id="memcachedClient" factory-bean="memcachedClientBuilder" factory-method="build" destroy-method="shutdown" />

3. memcached.properties 配置内容:

memcached.connectionPoolSize=50
memcached.failureMode=true
#server
memcached.server.host=127.0.0.1
memcached.server.port=11211
memcached.server.weight=1

4. 上面可以设置多台memcached服务器,并指定weight权重。XMemcachedClientBuilder 有两个参数,第一个参数是server配置的list,第二个参数是每台服务器的权重。如:

 1 <bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
 2         <constructor-arg>
 3             <list>
 4                 <bean class="java.net.InetSocketAddress">
 5                     <constructor-arg>
 6                             <value>${memcached.server1.host}</value>
 7                     </constructor-arg>
 8                     <constructor-arg>
 9                             <value>${memcached.server1.port}</value>
10                     </constructor-arg>
11                 </bean>
12                 <bean class="java.net.InetSocketAddress">
13                     <constructor-arg>
14                             <value>${memcached.server2.host}</value>
15                     </constructor-arg>
16                     <constructor-arg>
17                             <value>${memcached.server2.port}</value>
18                     </constructor-arg>
19                 </bean>
20             </list>
21         </constructor-arg>
22         <constructor-arg>
23             <list>
24                 <value>${memcached.server1.weight}</value>
25                 <value>${memcached.server2.weight}</value>
26             </list>
27         </constructor-arg>
28         <property name="connectionPoolSize" value="${memcached.connectionPoolSize}" />
29         <property name="commandFactory">
30                 <bean class="net.rubyeye.xmemcached.command.TextCommandFactory"></bean>
31         </property>
32         <property name="sessionLocator">
33                 <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
34         </property>
35         <property name="transcoder">
36                 <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
37         </property>
38     </bean>

相应properties配置变更为:

#server1
memcached.server1.host=127.0.0.1
memcached.server1.port=11211
memcached.server1.weight=1
#server2
memcached.server2.host=127.0.0.1
memcached.server2.port=11212
memcached.server2.weight=2

5. 下面简单提供了一份单台memcached服务器的存取操作及获取memcached状态信息的代码实例:

 1 /*
 2  * Copyright 2013 Alibaba.com All right reserved. This software is the
 3  * confidential and proprietary information of Alibaba.com ("Confidential
 4  * Information"). You shall not disclose such Confidential Information and shall
 5  * use it only in accordance with the terms of the license agreement you entered
 6  * into with Alibaba.com.
 7  */
 8 package com.yunos.tv.server.controller.web;
 9
10 import java.net.InetSocketAddress;
11 import java.util.Iterator;
12 import java.util.Map;
13 import java.util.Map.Entry;
14 import java.util.concurrent.TimeoutException;
15
16 import net.rubyeye.xmemcached.MemcachedClient;
17 import net.rubyeye.xmemcached.exception.MemcachedException;
18
19 import org.springframework.beans.factory.annotation.Autowired;
20 import org.springframework.stereotype.Controller;
21 import org.springframework.web.bind.annotation.RequestMapping;
22 import org.springframework.web.bind.annotation.RequestMethod;
23 import org.springframework.web.bind.annotation.ResponseBody;
24
25 /**
26  * 类DemoController.java的实现描述:TODO 类实现描述
27  * @author riqi 2013-6-28 上午10:48:58
28  */
29
30 @Controller
31 @RequestMapping(value = "/demo")
32 public class DemoController extends BaseController {
33
34     @Autowired
35     private MemcachedClient memcachedClient;
36
37     @SuppressWarnings("unchecked")
38     @ResponseBody
39     @RequestMapping(value = "/hello", method = RequestMethod.GET)
40     public String helloWorld() {
41         try {
42             memcachedClient.set("string", 3600, "Hello World!");
43             Map<InetSocketAddress, Map<String, String>> memcachedStats = memcachedClient.getStats();
44
45             String helloWord = memcachedClient.get("string");
46             StringBuilder strBuilder = new StringBuilder(helloWord);
47             strBuilder.append("\n");
48
49             for (Iterator<?> statsIterator = memcachedStats.entrySet().iterator(); statsIterator.hasNext();) {
50                 Map.Entry<InetSocketAddress, Map<String, String>> entry = (Entry<InetSocketAddress, Map<String, String>>) statsIterator.next();
51
52                 strBuilder.append(entry.getKey() + ":" + entry.getValue());
53                 strBuilder.append("\n");
54             }
55
56             return strBuilder.toString();
57
58         } catch (TimeoutException e) {
59             e.printStackTrace();
60         } catch (InterruptedException e) {
61             e.printStackTrace();
62         } catch (MemcachedException e) {
63             e.printStackTrace();
64         }
65
66         return "";
67     }
68 }

浏览器输入:http://localhost:8080/demo/hello.htm

输出内容:

Hello World!
/127.0.0.1:11211:{delete_hits=0, bytes=68, total_items=62, listen_disabled_num=0, auth_errors=0, evictions=0, version=1.4.4-14-g9c660c0, pointer_size=32, time=1373528740, incr_hits=0, threads=4, limit_maxbytes=67108864, bytes_read=169146, curr_connections=109, get_misses=0, bytes_written=2559445, connection_structures=110, cas_hits=0, delete_misses=0, total_connections=310, cmd_flush=0, uptime=1426, pid=6312, cas_badval=0, get_hits=61, curr_items=1, cas_misses=0, accepting_conns=1, cmd_get=61, cmd_set=62, incr_misses=0, auth_cmds=0, decr_misses=0, decr_hits=0, conn_yields=0}
时间: 2025-01-03 08:27:33

Spring整合xmemcached过程的相关文章

spring 整合websocket过程中遇到的问题

写了一个告警推送的websocket,由于类中用到了其它bean所以自然的用@Autowired注解将bean注入: @ServerEndpoint(value = "/alarm/{id}", configurator = SpringConfigurator.class) public class AlarmEndpoint { @Autowired private AlarmSimulator alarmSimulator; @OnOpen public void onOpen(

使用memcached客户端Xmemcached与Spring整合

1 简介 Xmemcached是一个高性能的基于java nio的memcached客户端.在经过三个RC版本后,正式发布1.10-final版本. xmemcached特性一览: 1.高性能 2.支持完整的memcached文本协议,二进制协议将在1.2版本实现. 3.支持JMX,可以通过MBean调整性能参数.动态添加/移除server.查看统计等. 4.支持客户端统计 5.支持memcached节点的动态增减. 6.支持memcached分布:余数分布和一致性哈希分布. 7.更多的性能调整

Xmemcached使用之与Spring整合

转自:http://hi.baidu.com/tjbaso/item/22f3c32b062ebefb50fd87b8 1 简介Xmemcached是一个高性能的基于java nio的memcached客户端.在经过三个RC版本后,正式发布1.10-final版本.xmemcached特性一览:1.高性能2.支持完整的memcached文本协议,二进制协议将在1.2版本实现.3.支持JMX,可以通过MBean调整性能参数.动态添加/移除server.查看统计等.4.支持客户端统计5.支持memc

Spring(十三)Spring整合JDBC

做开发不连接数据库怎么行!Spring整合JDBC过程中,数据源可以直接都在beans.xml里配置,也可以把数据单独放在一个properties文件里,方便维护. 首先放入各种jar包,连接MySQL当然要放数据驱动文件. jar包什么的对照项目截图,切面aspect和cglib在这个工程没用到,jar包可以不添加进来 beans.xml,在头文件加上tx事务相关的引用,其他要注意的在文件的注释里基本都点到了 <?xml version="1.0" encoding="

使用memcachedclientXmemcached与Spring整合

1 简单介绍 Xmemcached是一个高性能的基于java nio的memcachedclient.在经过三个RC版本号后.正式公布1.10-final版本号. xmemcached特性一览: 1.高性能 2.支持完整的memcached文本协议,二进制协议将在1.2版本号实现. 3.支持JMX,能够通过MBean调整性能參数.动态加入/移除server.查看统计等. 4.支持client统计 5.支持memcached节点的动态增减. 6.支持memcached分布:余数分布和一致性哈希分布

spring 整合 servlet

目的:记录spring整合 servlet过程demo.(企业实际开发中可能很少用到),融会贯通. 前言:在学习spring 过程(核心 ioc,aop,插一句 学了spring 才对这个有深刻概念, 在net时候都是直接使用,不得不说 java 还是深刻点)过程中,我们基本上都是在test中测试如图 环境:IDEA 但是,开发中是 spring容器 是共享的,其他地方直接调用,这里就涉及到spring和其他的整合,此文servlet 为测试点. 1:新建servlet 过程参考,https:/

mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)

继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-web 2.修改web.xml,配置启动Spring容器 3.新建BookServer 4.新建BookServlet 5.修改ApplicationContext.xml 6.测试 继续!!! 五.使用监听器启动Spring容器 1.修改pom.xml,添加Spring-web包(注:上一篇中的pom

mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文件复制到src/main/webapp下,删掉WebContent 5.修改Deployment Assembly 6.测试 二.mybatis访问mysql 1.数据库准备 2.修改pom.xml 3.创建实体类 4.创建访问接口 5.添加映射文件 6.添加MyBatisCfg.xml配置文件,注

Spring整合JMS——基于ActiveMQ实现

1.1     JMS简介 JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑.对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应:另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收. 1.2