`

memcached笔记(3):xmemcached的FAQ

阅读更多

一、XMemcached是什么?

经常碰到的一个问题是很多朋友对memcached不了解,误以为xmemcached本身是一个缓存系统。Memcached是一个开源的,C写的分布式key-value缓存,XMemcached只是它的一个访问客户端。Memcached通过网络协议跟客户端交互,通过客户端你才可以去使用memcached,xmemcached是它的java客户端之一。

 

二、为什么要选择xmemcached?

memcached的java客户端有多个选择,为什么要选择xmemcached?理由如下:

1、支持所有的文本协议和二进制协议,支持连接Kestrel和TokyoTyrant等memcached协议兼容的系统并作特殊处理。

2、支持动态添加和删除memcached节点。

3、支持客户端统计

4、支持JMX监控和统计,可以通过JMX增删节点。

5、高性能

6、支持节点的权重设置

7、支持nio的连接池,在高负载环境下提高吞吐量。

 

三、对jdk版本有什么要求?

Xmemcached仅支持jdk1.5及以上版本。

 

四、使用的时候需要创建多个MemcachedClient对象吗?MemcachedClient是不是线程安全?

MemcachedClient是线程安全的,由于xmemcached的网络层实现是基于nio长连接的,因此你并不需要重复创建多个MemcachedClient对象,通常来说将MemcachedClient设置为全局的唯一单例的服务使用,如果是使用spring配置,那更是简单,在spring配置文件里配置一个MemcachedClient,其他对象引用即可使用。

 

五、为什么会抛出java.util.TimeoutException?

这是由于xmemcached的通讯层是基于非阻塞IO的,那么在请求发送给memcached之后,需要等待应答的到来,这个等待时间默认是1秒,如果超过1秒就抛出java.util.TimeoutExpcetion给用户。如果你频繁抛出此异常,可以尝试将全局的等待时间设置长一些,如我在压测中设置为5秒:

MemcachedClient  memcachedClient=……

memcachedClient.setOpTimeout(5000L);

 

请注意,setOpTimeout设置的是全局的等待时间,如果你仅仅是希望将get或者set等操作的超时延长一点,那么可以通过这些方法的重载方法来使用:

<T> T get(java.lang.String key,long timeout)

boolean set(java.lang.String key, int exp,java.lang.Object value,

            long timeout)

……

 

六、Kestrel和TokyoTyrant不支持flag字段,xmemcached是怎么解决的?

Xmemcached在存储的value前面自动加上和去除4个字节的flag,这一切对应用来说是透明的。具体请看用户指南。

 

 

七、连接memcacheq,取出来的消息比放进去的多?

这是由于memcacheq和kestrel一样,不支持multi get协议,因此只要关闭xmemcached的multi get优化就可以了。

memcachedClient.setOptimizeGet(false);

所谓multi get优化是指xmemcached会将连续的单个get请求合并成一个multi get请求作批量获取,提高效率。

 

八、连接kestrel,为什么过一段时间会自动断开并重连?

你可能使用的是kestrel 1.2以下版本,kestrel 1.2才支持version协议,xmemcached是基于version协议做心跳检测,因此当使用kestrel 1.2以下版本的时候会发生心跳检测失败并断开连接重连的情况,你可以升级kestrel,也可以关闭心跳检测:

memcachedClient.setEnableHeartBeat(false);

 

九、我使用maven,怎么引用xmemcached?

xmemcached 1.4.1已经加入了maven的中心仓库,因此你可以直接引用

       <dependency>

            <groupId>com.googlecode.xmemcached</groupId>

            <artifactId>xmemcached</artifactId>

            <version>1.4.1</version>

        </dependency>

如果是之前版本,我推荐你升级,或者自己手工加入私人的maven仓库。

 

十、连接池是怎么回事?设置多大为好?

在高负载环境下,nio的单连接也会遇到瓶颈,此时你可以通过设置连接池来让更多的连接分担memcached的请求负载,从而提高系统的吞吐量。设置连接池通过

MemcachedClientBuilder builder = new    XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000"));

builder.setConnectionPoolSize(5);

MemcachedClient client=builder.build();

或者通过spring配置也可以。

连接池通常不建议设置太大,我推荐在0-30之间为好,太大则浪费系统资源,太小无法达到分担负载的目的。

 

十一、性能建议及优化手段

    性能的调整只能给出一般性的原则,实际情况千差万别,每次调整都需要做实际的测量才能确定是否带来期望的效果。

 

1、如果你的数据较小,如在1K以下,默认的配置选项已经足够。如果你的数据较大,我会推荐你调整网络层的TCP选项,如设置socket的接收和发送缓冲区更大,启用Nagle算法等等:    

            MemcachedClientBuilder builder = new XMemcachedClientBuilder(

                    AddrUtil.getAddresses(servers));

            builder.setSocketOption(StandardSocketOption.SO_RCVBUF, 32 * 1024); // 设置接收缓存区为32K,默认16K

            builder.setSocketOption(StandardSocketOption.SO_SNDBUF, 16 * 1024); // 设置发送缓冲区为16K,默认为8K

            builder.setSocketOption(StandardSocketOption.TCP_NODELAY, false); // 启用nagle算法,提高吞吐量,默认关闭

 

默认如果连接超过5秒没有任何IO操作发生即认为空闲并发起心跳检测,你可以调长这个时间:  

  builder.getConfiguration().setSessionIdleTimeout(10000);  // 设置为10秒;

 

更多网络层配置选项请参见Configuration类。

 

2、Xmemcached默认会做两个优化:将连续的单个get合并成一个multi get批量操作获取,将连续的请求合并成socket发送缓冲区大小的buffer发送。

如果你对响应时间比较在意,那么可以将合并的因子减小,或者关闭合并buffer的优化:

    memcachedClient.setMergeFactor(50);   //默认是150,缩小到50

    memcachedClient.setOptimizeMergeBuffer(false);  //关闭合并buffer的优化

 

如果你对吞吐量更在意,那么也可将合并因子调大,默认是150。但是也不可太大,太大可能导致平均响应时间延长。

 

3、如果你对心跳检测不在意,也可以关闭心跳检测,减小系统开销

memcachedClient.setEnableHeartBeat(false);

这个关闭,仅仅是关闭了心跳的功能,客户端仍然会去统计连接是否空闲,禁止统计可以通过:

builder.getConfiguration().setStatisticsServer(false);

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    memcached全套安装资料,memcached库,libevent库, C/C++ memcached 客户端库:libmemcached

    memcached 安装文件,libevent库, C/C++ memcached 客户端库:libmemcached 全套工具:libevent-1.3.tar.gz,memcached-1.2.2.tar.gz,libmemcached-0.42.tar.gz 测试通过的

    hibernate-memcached包

    **hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统Memcached整合到Hibernate中,作为其二级缓存解决方案。在大型分布式应用中,缓存技术是提高性能的关键,特别是...

    memcached安装及java应用使用memcached

    3. **Java客户端库**:介绍常用的Java库,如spymemcached、xmemcached等,用于与memcached通信。 4. **配置Java应用**: - **添加依赖**:在Maven或Gradle项目中引入相应客户端库。 - **连接设置**:如何配置连接...

    xmemcached jar包,源文件,api

    **xmemcached:高效、强大的Memcached客户端** xmemcached是一个高性能、易用且功能丰富的Java Memcached客户端库。它提供了全面的API,使得开发者能够方便地与Memcached缓存系统进行交互,从而提高Web应用的性能和...

    spring整合memcached

    3. **创建Memcached模板**:使用Spring Data的抽象层,创建一个MemcachedTemplate,它是操作Memcached的工具类: ```xml ``` 4. **配置Memcached连接工厂**:创建并配置MemcachedConnectionFactory,用于...

    xmemcached

    3. **线程安全**:Xmemcached保证了在多线程环境下的安全性,无需担心并发问题。 4. **自动故障转移**:当连接到的Memcached服务器出现故障时,Xmemcached能够自动检测并切换到其他正常服务器,保证服务的连续性。 ...

    xmemcached-1.4.3.jar

    xmemcached是一款高性能、轻量级的Java客户端库,专为Memcached缓存系统设计,其1.4.3版本提供了丰富的功能和优化,旨在提升应用的性能和可扩展性。在本文中,我们将详细探讨xmemcached的核心特性和使用方法,帮助...

    java_memcached-release_2.5.1.jar Memcache java jar 包

    3. **序列化与反序列化**:Java Memcached客户端库通常会处理对象到字节流的转换,以便于在网络中传输,并在接收端将字节流还原为对象。这使得可以存储任何类型的Java对象,只要它们实现了序列化接口。 4. **过期...

    memcached缓存数据库jar包

    1. 下载对应的`memcached` Java客户端库,例如spymemcached或xmemcached。 2. 解压缩下载的库,找到包含的jar文件,如`spymemcached-x.x.x.jar`或`xmemcached-x.x.x.jar`。 3. 将这个jar文件复制到你的Tomcat安装...

    Java的开源高性能memcached客户端XMemcached.zip

    Xmemcached是基于java nio实现的高性能可扩展的memcached客户端。它的主要特点: 高性能,稳定可靠,已经在众多公司的众多项目里得到应用。 功能完备:客户端分布式、权重、最新最完整的协议支持。 ...

    Xmemcached用户指南

    XMemcached是一款针对Java平台设计的高性能Memcached客户端。Memcached是一种分布式内存对象缓存系统,主要用于减轻数据库负担,提高动态Web应用程序的响应速度。随着技术的发展,Memcached也被用作内存式数据库。该...

    memcached_exporter:从Memcached服务器导出指标以供Prometheus使用

    Memcached Exporter for Prometheus Prometheus的导出器。建造Memcached导出器从Memcached服务器导出指标,以供Prometheus使用。 服务器被指定为程序的--memcached.address标志(默认为localhost:11211 )。 默认...

    xmemcached api doc

    xmemcached 是一个高性能、线程安全的 Java 客户端库,用于连接和操作 Memcached 分布式内存缓存系统。它提供了丰富的 API,使得开发人员能够轻松地在应用程序中集成 Memcached 功能,以提升数据访问速度和系统性能...

    Cache-Memcached-AnyEvent:AnyEvent兼容的Memcached客户端

    Cache :: Memcached :: AnyEvent-AnyEvent兼容的Memcached客户端 概要 use Cache::Memcached::AnyEvent; my $memd = Cache::Memcached::AnyEvent-&gt;new({ servers =&gt; [ '127.0.0.1:11211' ], compress_threshold =...

    memcached安装错误解决文件

    3. 配置文件错误:仔细检查memcached的配置文件,确保所有参数设置正确,如最大内存大小、超时时间等。 总的来说,解决memcached安装错误需要细致的排查和适当的系统知识。遇到问题时,先查看错误信息,再检查系统...

    memcached-operator:Kubernetes Memcached操作员教程

    memcached-operator:Kubernetes Memcached操作员教程

    Xmemcached用户指南.pdf

    3. **客户端分布**:XMemcached内置了客户端分布策略,特别是使用一致性哈希算法,确保数据在节点间的均匀分布。 4. **节点权重设定**:允许为每个Memcached节点分配权重,以调整负载均衡,权重高的节点承担更多...

    memcached-cli:PHP CLI与Memcached进行交互

    Memcached Cli可用命令// R/W accessphp vendor/bin/mcc set [key] [value]php vendor/bin/mcc get [key]php vendor/bin/mcc delete [key]// Insightsphp vendor/bin/mcc statsphp vendor/bin/mcc search [pattern]/...

    memcached java client

    本篇文章将详细介绍两个常用的Java Memcached客户端:xmemcached和memcache-client-forjava。 **1. xmemcached** xmemcached是由Ketoo开发的一个高性能、高可用性的Java Memcached客户端。它提供了丰富的API,支持...

    php_memcached_dll:Windows php-memcached dll文件

    memcached_support: 3.1.4 名称 is_support SASL支持 不 会话支持 是的 二进制支持 不 json支持 是的 msgpack支持 不 3.1.5 名称 is_support SASL支持 不 会话支持 是的 二进制支持 是的 json支持 是的 ...

Global site tag (gtag.js) - Google Analytics