文档章节

java客户端提交数据到memcached方法

lcdmusic
 lcdmusic
发布于 2015/07/09 10:21
字数 1719
阅读 46
收藏 0

终于把nginx+memcached+tomcat集群windows下布置完成,但是遇到java客户端提交数据到memcached的问题,上网看了好多人的帖子,发现了3种方法

1. 三种API比较 
1)      memcached client for java

较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。


2)      spymemcached

A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。


3)      xmemcached

XMemcached 同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接 池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。


2.  建议

由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。

XMemcached 也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持 JMX、与Spring框架和Hibernate-memcached的集成、客户端连接池、可扩展性好等。

我使用的是建议方法memcached client for java,

Memcached-Java-Client官网jar包的下载地址:

https://github.com/gwhalin/Memcached-Java-Client/downloads

Memcached-Java-Client的说明文档:

https://github.com/gwhalin/Memcached-Java-Client

具体实现步骤为:

1.将jar包引入项目中,我引入了4个commons-pool-1.5.6.jar,java_memcached-release_2.6.2.jar,slf4j-api-1.6.1.jar,slf4j-simple-1.6.1.jar

2.写测试代码:

import java.util.Date; 

import com.danga.MemCached.MemCachedClient; 
import com.danga.MemCached.SockIOPool; 

public class MemCached { 
    // 创建全局的唯一实例 
    protected static MemCachedClient mcc = new MemCachedClient(); 

    protected static MemCached memCached = new MemCached(); 

    // 设置与缓存服务器的连接池 
    static { 
        // 服务器列表和其权重,个人memcached地址和端口号 
        String[] servers = { "192.168.88.137:11211" }; 
        Integer[] weights = { 3 }; 

        // 获取socke连接池的实例对象 
        SockIOPool pool = SockIOPool.getInstance(); 

        // 设置服务器信息 
        pool.setServers(servers); 
        pool.setWeights(weights); 

        // 设置初始连接数、最小和最大连接数以及最大处理时间 
        pool.setInitConn(5); 
        pool.setMinConn(5); 
        pool.setMaxConn(250); 
        pool.setMaxIdle(1000 * 60 * 60 * 6); 

        // 设置主线程的睡眠时间 
        pool.setMaintSleep(30); 

        // 设置TCP的参数,连接超时等 
        pool.setNagle(false); 
        pool.setSocketTO(3000); 
        pool.setSocketConnectTO(0); 

        // 初始化连接池 
        pool.initialize(); 
    } 

    /** 
     * 保护型构造方法,不允许实例化! 
     * 
     */ 
    protected MemCached() { 

    } 

    /** 
     * 获取唯一实例. 
     * 
     * @return 
     */ 
    public static MemCached getInstance() { 
        return memCached; 
    } 

    /** 
     * 添加一个指定的值到缓存中. 
     * 
     * @param key 
     * @param value 
     * @return 
     */ 
    public boolean add(String key, Object value) { 
        return mcc.add(key, value); 
    } 

    public boolean add(String key, Object value, Date expiry) { 
        return mcc.add(key, value, expiry); 
    } 

    /** 
     * 替换一个指定的值到缓存中. 
     * 
     * @param key 
     * @param value 
     * @return 
     */ 
    public boolean replace(String key, Object value) { 
        return mcc.replace(key, value); 
    } 

    public boolean replace(String key, Object value, Date expiry) { 
        return mcc.replace(key, value, expiry); 
    } 

    /** 
     * 删除一个指定的值到缓存中. 
     * 
     * @param key 
     * @param value 
     * @return 
     */ 
    public boolean delete(String key) { 
        return mcc.delete(key); 
    } 

    /** 
     * 根据指定的关键字获取对象. 
     * 
     * @param key 
     * @return 
     */ 
    public Object get(String key) { 
        return mcc.get(key); 
    } 

    public static void main(String[] args) { 
        MemCached cache = MemCached.getInstance(); 
        // cache.add("zf", 18); 
        // cache.replace("zf", 19); 
        cache.delete("zf"); 
        System.out.println("zf get value : " + cache.get("zf")); 
    } 


3.测试阶段

1)取消cache.add("zf",18)注释,将cache.replace("zf", 19);和cache.delete("zf");注释掉,增加zf到memcached中

2)将cache.add("zf",18);cache.replace("zf", 19);和cache.delete("zf");注释,输出结果为刚才添加的内容,表示该值已经存入memcached中

3) 将cache.delete("zf");取消注释,再运行,控制台输出 zf get value : null,该值已删除

其他测试方法:

使用telnet命令语句查看:

1)cmd中输入telnet 192.168.88.137 11211(自己memcached地址及端口号)

2)输入命令stats,查看 STAT curr_items 数量,增加、修改、删除此数量随之变化

具体memcached输入stats命令解释如下:(转载:http://www.cnblogs.com/suger/archive/2011/09/06/2168319.html

STAT pid 1552

STAT uptime 3792

STAT time 1262517674

STAT version 1.2.6

STAT pointer_size 32

STAT curr_items 1

STAT total_items 2

STAT bytes 593

STAT curr_connections 2

STAT total_connections 28

STAT connection_structures 9

STAT cmd_get 3

STAT cmd_set 2

STAT get_hits 2

STAT get_misses 1

STAT evictions 0

STAT bytes_read 1284

STAT bytes_written 5362

STAT limit_maxbytes 67108864

STAT threads 1

END

这里显示了很多状态信息,下边详细解释每个状态项:

1.  pid: memcached服务进程的进程ID

2.  uptime: memcached服务从启动到当前所经过的时间,单位是秒。

3.  time: memcached服务器所在主机当前系统的时间,单位是秒。

4.  version: memcached组件的版本。这里是我当前使用的1.2.6。

5.  pointer_size:服务器所在主机操作系统的指针大小,一般为32或64.

6.  curr_items:表示当前缓存中存放的所有缓存对象的数量。不包括目前已经从缓存中删除的对象。

7.  total_items:表示从memcached服务启动到当前时间,系统存储过的所有对象的数量,包括目前已经从缓存中删除的对象。

8.  bytes:表示系统存储缓存对象所使用的存储空间,单位为字节。

9.  curr_connections:表示当前系统打开的连接数。

10. total_connections:表示从memcached服务启动到当前时间,系统打开过的连接的总数。

11. connection_structures:表示从memcached服务启动到当前时间,被服务器分配的连接结构的数量,这个解释是协议文档给的,具体什么意思,我目前还没搞明白。

12. cmd_get:累积获取数据的数量,这里是3,因为我测试过3次,第一次因为没有序列化对象,所以获取数据失败,是null,后边有2次是我用不同对象测试了2次。

13. cmd_set:累积保存数据的树立数量,这里是2.虽然我存储了3次,但是第一次因为没有序列化,所以没有保存到缓存,也就没有记录。

14. get_hits:表示获取数据成功的次数。

15. get_misses:表示获取数据失败的次数。

16. evictions:为了给新的数据项目释放空间,从缓存移除的缓存对象的数目。比如超过缓存大小时根据LRU算法移除的对象,以及过期的对象。

17. bytes_read:memcached服务器从网络读取的总的字节数。

18. bytes_written:memcached服务器发送到网络的总的字节数。

19. limit_maxbytes:memcached服务缓存允许使用的最大字节数。这里为67108864字节,也就是是64M.与我们启动memcached服务设置的大小一致。

20. threads:被请求的工作线程的总数量。这个解释是协议文档给的。


本文转载自:http://blog.csdn.net/whb123andy/article/details/46741695

共有 人打赏支持
lcdmusic
粉丝 3
博文 156
码字总数 9951
作品 0
朝阳
程序员
私信 提问
java客户端提交数据到memcached方法memcached+java+client个人总结

终于把nginx+memcached+tomcat集群windows下布置完成,但是遇到java客户端提交数据到memcached的问题,上网看了好多人的帖子,发现了3种方法 1. 三种API比较 1) memcached client for java 较...

cheese
2013/01/08
0
0
Memcached Java 客户端 2.6.1 发布

Memcached是被广泛使用的分布式缓存技术。不同的语言有不同的Memcached客户端程序,对于Java客户端来说,首推Memcached Java Client(http://github.com/gwhalin/Memcached-Java-Client )。...

小编辑
2011/06/27
3.8K
1
Ehcache和MemCached比较分析

项目 Memcache Ehcache 分布式 不完全,集群默认不实现 支持 集群 可通过客户端实现 支持(默认是异步同步) 持久化 可通过第三方应用实现,如sina研发的memcachedb,将cache的数据保存到[ur...

浮躁的码农
2015/07/24
0
0
memcached 客户端编程

最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的...

newworld2010
2013/04/26
0
0
原创:分享封装好的面向JAVA的memcached客户端操作类

书接上文:理论加实践,谈谈我对memcached的学习感悟! 接近两周的时间,终于将面向JAVA的memcached客户端操作类封装写完。 现将当前的成果共享上来,希望有经验的朋友能指点一二。 一、初衷...

netwild
2013/05/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq

灰暗
24分钟前
0
0
Flink

flink HA部署 flink搭建,采用分布式部署方式,分别为A,B,C三个节点。其中A为master;A,B,C为worker。 本文使用的用户是hadoop用户(自己新建) 先决条件 Java 1.8.x or higher scala 自己使用...

-九天-
51分钟前
1
0
数据中台和传统数仓的区别

中台系统把业务层同性的算法能力,服务能力,业务能力高度集成,有效组织 ,动态规划。更好的帮助上层业务。 今天就让我们看看关于数据中台的问答吧。 1 Q : 什么是数据中台? A : 数据中台是...

hblt-j
52分钟前
4
0
Java在什么时候会出现内存泄漏

在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对...

群星纪元
55分钟前
2
0
android 打开摄像头

private SurfaceHolder mHolder; private SurfaceView mSurfaceView; private Camera mCamera; mSurfaceView = (SurfaceView) this.findViewById(R.id.camsurfaceView1); mHolder = mSurface......

jingshishengxu
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部