Memcache-Java-Client-Release源码阅读(之四)

来源:互联网 发布:codol过一会就数据异常 编辑:程序博客网 时间:2024/06/05 18:20

一、主要内容
本章节的主要内容是介绍Memcache Client其他一些基本操作的大致实现,如flush操作,delete操作,incr/decr操作等。

二、准备工作
1、服务器启动192.168.0.106:11211,192.168.0.106:11212两个服务端实例。
2、示例代码:

MemCachedClient mcc = new MemCachedClient();boolean success = mcc.set("test1", "Hello!");System.out.println(success);String val = mcc.get("test1");System.out.println(val);mc.delete("test1", new Date(1000));mc.addOrIncr("testInt", 1);// 省略......

三、代码阅读
阅读前一篇文章可以了解到,memcache client命令操作的套路都是类似的,这里就简单介绍一下其他操作的基本思路。
1、flushAll操作
循环取每个server,组装”flush_all\r\n”命令发送,用Sock发送,用SockInputStream实例对象getLine()方法获取memcache服务端的响应,查看是否有”OK”字样。
AscIIClient类是直接使用String对象组装命令,AscIIUDPClient类使用FlushAllCommand对象。

2、keyExists操作
调用get方法,比较get是否为null,return(this.get(key,null) != null),如下代码:
public boolean keyExists(String key) {
return (this.get(key, null) != null);
}

3、delete操作
组装成delete命令,唯一不同的是SockInputStream.getLine()得到的响应特征不同而已。
带延时操作命令:delete foo 1 (延时1秒)
注意一下代码里延迟时间单位为毫秒,但telnet命令的单位为秒,中间需要进行转换。

4、addOrIncr/addOrDecr操作
其实是调用的set方法,参数cmdname的值为add,最后拼装成add命令,如add foo 32 0。
incr操作与decr操作类似,都是调用AscIIClient的incrdecr方法,cmdname参数不同而已,当value参数不传值时,默认为1,即做“加1”或“减1”的操作。
当incr与decr命令返回值为not_found时,统一返回-1,所以调用incr,decr前一定要先创建key值对象才能正常使用,比如调用addOrIncr方法,或是先调用add方法,然后再进行incr/decr操作,才能达到预期的效果。
addOrIncr和addOrDecr是一对可逆操作。

5、replace操作
组装成replace命令,replace操作可以更新之前set操作的过期时间 ,过期时间以最长时间为准。比如set操作时指定过期时间为5秒,replace操作指定过期时间为20秒,则该对象的过期时间变成20秒。

6、append/prepend操作
其实是调用set方法,带参数cmdname的值为append,组装成append命令,如append aa 32 0。
注意一下调用append操作前必须保证该缓存对象存在,直接调用append方法是没有用的。所以要先调用add方法,创建缓存对象后,再调用append方法。
prepend操作类似。

7、cas操作
memcached client命令为cas aa 32 0,跟telnet命令不一样。注意带了casUnique指令,分两次put的。只有cas方法才有同步效果,set是没有这个效果的。

8、stats操作等
轮询所有的已连接服务器,拼装stats命令,获取结果,解析封装到Map集合中(响应格式STAT pid 129443,按格式解析就好,跟stats命令类似)。
类似的还有:statsItems操作、statsslabs操作、statsCacheDump操作,这几个操作都是组装成相应的telnet命令,有参数的适当加上一点参数,最后调用stats方法。

9、getMulti()操作
等同于多次get操作,但性能要比多次get操作要高,原因是getMulti操作明显减少了Sock连接的次数。例如,有4个缓存对象key1,key2,key3,key4,分别存储在11211,11212两个节点当中,如果使用普通的get方法,需要创建四次Sock连接,但使用getMulti操作,最多创建两次连接(创建一次连接的情况是这四个缓存对象都存储在一个服务端节点上)。

这里以上只是选取了几个常用的操作做了简单分析,里面还有许多的奥妙,可以一边阅读调试代码,一边使用telnet命令对比,这样会更好理解。

四、FAQ
Q1:怎么感觉突然多了好多操作啊?
A1:是的,这些操作我个人暂时分为原生操作和衍生操作。原生操作指的是memcache 服务端支持的命令,即telnet中使用到的命令,例如get,set,cas等 ;衍生操作如keyExists和getMulti操作,都是在原生操作的基础上,通过一定的逻辑处理,衍变出来的,其核心还是使用原生操作命令,一是为了功能方便,二是为了提高使用性能。

1 0
原创粉丝点击