文档章节

xmemcached使用之与spring整合

z
 zxj521
发布于 2016/07/06 16:18
字数 945
阅读 7
收藏 0

关键字: 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、更多的性能调整选项。


2 与Spring整合
XMemcached从1.1.2开始,能灵活方便的与Spring Framework整合在一起使用。
2.1 最简单例子 
<bean name="memcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean"> 
<property name="servers"> 
<value>host1:port1 host2:port2</value>
</property>
</bean>
然后在bean中就可以使用memcachedClient了。
2.2 复杂一点儿的例子
<bean name="memcachedClient"
                class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
                <property name="servers">
                        <value>host1:port1 host2:port2 host3:port3</value>
                </property>
                <property name="weights">
                        <list>
                                <value>1</value>
                                <value>2</value>
                                <value>3</value>
                        </list>
                </property>
                <property name="sessionLocator">
                        <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
                </property>
                <property name="transcoder">
                        <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
                </property>
                <property name="bufferAllocator">
                        <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean>
                </property>
        </bean>

其中各参数的意义:

 

参数

含义

servers

服务器列表,格式:ip:port

weights

主机映射:host1对应1号、host2对应2号..

sessionLocator

Session 分配器,有自带的,影响分布式

transcoder

通信编码方式

bufferAllocator

缓冲区分配器

       注:

       默认标准Hash, hash(key) mod server_count (余数分布)

 

MemcachedClientBuilder builder = new XMemcachedClientBuilder(                                        AddrUtil.getAddresses("server1:11211 server2:11211 server3:11211")); MemcachedClient mc = builder.build();

 

可以改为Consistent Hash(一致性哈希):

 

MemcachedClientBuilder builder = new XMemcachedClientBuilder(                                        AddrUtil.getAddresses("server1:11211 server2:11211 server3:11211")); builder.setSessionLocator(new KetamaMemcachedSessionLocator()); MemcachedClient mc = builder.build();

使用实例
3.1介绍
目前支持所有的memcached文本协议(二进协议正在开发中,预计在1.2中会出现) ,现包括了get/gets、set、add、replace、delete、append、prepend、cas、multiget/gets、incr、decr、version、stats、flush_all等。
3.2 简单实例
MemcachedClient client;
   try {
    client = new XMemcachedClient("localhost",11211);//默认端口
    // store a value for one hour(synchronously).
    String someObject = "缓存这个一个小时可以吗?";
    client.set("key", 3600, someObject);

    // Retrieve a value.(synchronously).
    Object getSomeObject = client.get("key");
    // delete
    client.delete("key");
    System.out.println(getSomeObject.toString());
   } catch (TimeoutException e) {
    e.printStackTrace();
   } catch (InterruptedException e) {
    e.printStackTrace();
   } catch (MemcachedException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
以上代码是没有经过Spring管理的,XMemcachedClient是一个常驻程序。所以可以考虑将它置入到Spring中,配置方式前面已讲过。
使用方式见下: 
private MemcachedClient memcachedClient;

public void setMemcachedClient(MemcachedClient memcachedClient) {
   this.memcachedClient = memcachedClient;
}
注入后直接可使用。

3.3 监听服务器映射
Xmemcached源代码中XMemcachedClientMBean的setServerWeight(String server, int weight)方法可以将被监听服务器进行编号。具体使用方式可以用: 
MemcachedClientBuilderbuilder = new   XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000localhost:12001"),new int[]{1,3});   //编号为1,3
MemcachedClient memcachedClient=builder.build();
3.4动态改变被监听服务器
Xmemcached支持动态的增加或者删除监听服务器,方式如下:
MemcachedClient client=new XMemcachedClient(AddrUtil.getAddresses("server1:11211 server2:11211"));   
//Add two new memcached nodes   
client.addServer("server3:11211 server4:11211");   
//Remove memcached servers   
client.removeServer("server1:11211 server2:11211");
3.5 使用CAS更新缓存
CASOperation需要先gets获取cas值,然后再调用cas方法更新,XMemcached提供了一个包装类可以帮你搞定这两步。以下是一个使用实例:
class CASThread extends Thread {
        static final class IncrmentOperation implements CASOperation<Integer> {
                /*
                 *Max repeat times.if repeat times is great than this value,
                 *xmemcached will throw a TimeoutException.
                 */
                @Override
                public int getMaxTries() {
                        return Integer.MAX_VALUE; 
                }

                //increase current value                
                @Override
                public Integer getNewValue(long currentCAS, Integer currentValue) {
                        return currentValue + 1; // 当前值+1
                }
        }

        private XMemcachedClient mc;
        private CountDownLatch cd;

        public CASThread(XMemcachedClient mc, CountDownLatch cdl) {
                super();
                this.mc = mc;
                this.cd = cdl;

        }

        public void run() {
                try {
                        //do the cas operation
                        if (mc.cas("a", 0, new IncrmentOperation()))
                                this.cd.countDown();
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}

public class CASTest {

        public static void main(String[] args) throws Exception {
                if (args.length < 2) {
                        System.err.println("Usage:java CASTest [threadNum] [server]");
                    System.exit(1);
                }
                //threads num
                int NUM = Integer.parseInt(args[0]);
                XMemcachedClient mc = new XMemcachedClient(AddrUtil.getAddresses(args[1]));
                //initial value is 0
                mc.set("a", 0, 0);
                CountDownLatch cdl = new CountDownLatch(NUM);
                long start = System.currentTimeMillis();
                //start NUM threads to increment the value
                for (int i = 0; i < NUM; i++)
                        new CASThread(mc, cdl).start();

                cdl.await();
                System.out.println("test cas,timed:"
                                + (System.currentTimeMillis() - start));
                System.out.println("result=" + mc.get("a"));
                mc.shutdown();
        }
}

本文转载自:http://blog.csdn.net/quickgu/article/details/6885286

z
粉丝 1
博文 45
码字总数 6028
作品 0
郑州
程序员
私信 提问
怎么关闭XMemcached在控制台打印的心跳哟?

用了Xmemcached之后,在控制台里面一直打印 [Xmemcached-Reactor-2] com.google.code.yanf4j.nio.impl.NioTCPSession.readFromBuffer(223) | read 15 bytes from channel 这样的信息,这个应......

Leaybc
2015/06/01
1K
2
Xmemcached异常超时:Timed out waiting for operation

Hi: XMemcached版本:1.4.3 使用spring管理,创建连接时使用MemcachedClientBuilder。 查询时:client.get(searchPkgNameList, 5); 其中searchPkgNameList会很大,一次大概有300个key。 异常...

黑豆白
2014/04/25
8.4K
3
Xmemcached 2.0 发布,高性能Java memcached客户端

高性能Java memcached客户端——Xmemcached发布2.0.0版本,主要改进如下: 性能优化,在测试中文本协议实现有接近10%的性能提升。 批量获取key如果包含相同的key,会缓存反序列化后的对象,减...

dennis_zhuang
2014/04/28
7K
5
spring集成xmemcached

spring集成xmemcached <dependency> <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" </beans>......

石头哥哥
2013/07/08
163
0
Xmemcached 1.2.5 发布 - 下载

Xmemcached是基于java nio实现的高性能可扩展的memcached客户端。 该版本主要改进内容: 1、合并yanf4j到xmemcached,从1.2.5开始,xmemcached不再依赖yanf4j,仅依赖slf4j。 2、支持SASL验证...

红薯
2010/06/23
678
0

没有更多内容

加载失败,请刷新页面

加载更多

python学习10.04:Python list列表使用技巧及注意事项

前面章节介绍了很多关于 list 列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有 append() 和 extend(),删除元素功能的有 clear()、 remo...

太空堡垒185
29分钟前
4
0
新手插画学习的方法?教你如何自学?

插画学习的方法?教你如何自学? 从小喜欢画一些漫画头像随笔画,但是其实没有基础。个人偏好小清新手绘风的插画(如下图),每每看到都希望自己能画出这样的作品。 我其实很想说画这种美术功...

huihuajiaocheng
35分钟前
5
0
面试题

1、实现clone(); 涉及知识点: 1)、typeof 判断类型 2)、精确的判断类型:因为type null是object,type []是object,无法通过typeof来达到精确的判断 obj.toString()的结果和Object.prototyp...

gtandsn
46分钟前
5
0
CentOS 7 部署 tesseract-ocr

官方地址 github yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/ 若提示 yum-config-manager: command not found 执行以......

阿白
46分钟前
3
0
JAVA比较器中comparator的使用

一个专用的比较器Comparator Comparator是一个专用的比较器,当一个不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式...

daxiongdi
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部