发表于: 2017-10-25 23:35:54

1 773


今天完成的事

学习xmemcached,据说是中国原创的Spring与memcached整合,、

XMemcached特性: 

  • 高性能
  • 支持完整的memcached文本协议,二进制协议。
  • 支持JMX,可以通过MBean调整性能参数、动态添加/移除server、查看统计等。
  • 支持客户端统计
  • 支持memcached节点的动态增减。
  • 支持memcached分布:余数分布和一致性哈希分布。
  • 更多的性能调整选项。
  • 此外,XMemcached更容易与Spring集成

JAVA与Memcache结合有三种方式,还是很有争议的

  • Memcached Client for Java 比 SpyMemcached更稳定、更早、更广泛;
  • SpyMemcached 比 Memcached Client for Java更高效;
  • XMemcached 比 SpyMemcache并发效果更好。

接下来配置XMemcache

重写了一个配置文件

<?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"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/tx
                       http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
                       http://www.springframework.org/schema/aop
                       http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
                       http://www.springframework.org/schema/mvc
                       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">



<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <!--<property name="location" value="classpath:jdbc.properties" />-->
   <property name="locations">
       <list>
           <value>classpath:jdbc.properties</value>
           <value>classpath:memcached.properties</value>
       </list>
   </property>
</bean>

<!--配置XMemcached-->
<bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
   <property name="connectionPoolSize" value="${memcached.connectionPoolSize}"/>
   <!--配置连接池-->
   <constructor-arg>
       <list>
           <bean name="server1" class="java.net.InetSocketAddress">
               <constructor-arg value="${server1.memcached.host}"/>
               <constructor-arg value="${server1.memcached.port}"/>
           </bean>
           <!--<bean name="server2" class="java.net.InetSocketAddress">-->
           <!--<constructor-arg value="${server2.memcached.host}"/>-->
           <!--<constructor-arg value="${server2.memcached.port}"/>-->
           <!--</bean>-->
       </list>
   </constructor-arg>
   <constructor-arg>
       <list>
           <value>${server1.memcached.weight}</value>
           <!--<value>${server2.memcached.weight}</value>-->
       </list>
   </constructor-arg>
   <!--支持二进制文件-->
   <property name="commandFactory">
       <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"/>
   </property>
   <!--分布策略-->
   <property name="sessionLocator">
       <!--默认是采用余数哈希,这里改成一致性哈希-->
       <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"/>
   </property>
   <!--序列化转换器-->
   <property name="transcoder">
       <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder"/>
   </property>
</bean>

<bean name="memcachedClient" factory-method="build" factory-bean="memcachedClientBuilder" destroy-method="shutdown"/>
<!-- 关系型数据库+Memcached——结束 -->

</beans>

这次占位符能用了,应该就是版本的问题

发现xmcached可以加权  不过应该不是独有的功能

memcached.connectionPoolSize=1
memcached.failureMode=false

#server1
server1.memcached.host=127.0.0.1
server1.memcached.port=11211
server1.memcached.weight=1

测试类

public class xmecachedTest {

@Autowired
   private MemcachedClient memcachedClient;

   @Test
   public void test() {
try {
// 设置/获取
           memcachedClient.set("zlex", 36000, "set/get");
           assertEquals("set/get", memcachedClient.get("zlex"));

           // 替换
           memcachedClient.replace("zlex", 36000, "replace");
           assertEquals("replace", memcachedClient.get("zlex"));

           // 移除
           memcachedClient.delete("zlex");
           assertNull(memcachedClient.get("zlex"));
       } catch (TimeoutException e) {
// TODO Auto-generated catch block
           e.printStackTrace();
       } catch (InterruptedException e) {
// TODO Auto-generated catch block
           e.printStackTrace();
       } catch (MemcachedException e) {
// TODO Auto-generated catch block
           e.printStackTrace();
       }
}

为了了解memcached的工作原理,还跑去敲了命令

就不贴图了,只说一下遇到的问题,在telnet敲memcache命令,value的长度一定要跟实际长度对应,不然就出错,问了师兄,以后要存字符串长度会有封装好的类为我设定长度,所以不用担心需要另计算字符串的字节长度


还有memcache工具类,就不贴了,我也是用别人的,放上链接

http://blog.csdn.net/Heng_Ji/article/details/29825383


遇到的问题:在添加配置文件的时候web.xml默认的路径是默认webapp下,而测试类中@Runwith注解是默认resourse下,一时间竟不知道怎么解决

师兄给我一种方案:在Sring-mvc.xml中配置该文件的路径,默认resource,

还有一种方案:在配置文件路径前加classpath:因为  classpath= resourse


明天的计划:代码中添加xmemcache,学习序列化和反序列化,准备小课


收获:初步了解xmemcache  以及memcached增删改查命令, classpath=/ resourse ,memcached工具类


任务进度:任务6步骤2

任务开始时间:2017-10-21

预计demo时间:2017-10-26

是否有延期风险:暂无

禅道:http://task.ptteng.com/zentao/project-task-276.html





返回列表 返回列表
评论

    分享到