您的位置:首页 > 数据库 > Memcache

memcached 配置-使用-java结合

2015-04-01 08:19 411 查看
1.总览

安装memcached单节点/多节点
memcached中的简单命令
多个节点memcached
spymemcached---memcachedjavaclient的使用

一个简单的例子程序

2.简单安装memcached

一句话安装好memcached...

#yuminstallmemcached


启动memcached的步骤.





通过telnet可以简单的测试一下memcached的服务

localhost:可以改成远程的ip地址

11211:默认的端口号

#telnetlocalhost11211


3.memcached中的简单命令

通过set方法可以来添加缓存值.

set<key><flag><expires><byte>
Flag用于指定是否压缩数据,0不压缩,1压缩
Expires指定数据保存的时间,一种方法是秒数(不能超过30天),另
一种可以使用unix时间戳指定,0为有效期无限
Byte保存值的字节数


除了set方法之外还有很多方法.

储存命令(StorageCommands)

set添加或者覆盖一个Key,新的item放在LRU的顶端
add添加一个Key
replace覆盖一个key
append在一个已有的Key的Value后面追加数据

prepend在一个已有的Key的Value前面添加数据
casCheck-and-Set或者叫Compare-and-Swap,当数据等于指定值的时候,再对Key对应的value进行修改,

主要用于解决竞争条件
4.多个节点memcached

单机情况下使用多个端口号来模拟多个节点的memcached

memcached-d-p11212-unobody-c1024-m64
memcached-d-p11213-unobody-c1024-m64


开启了两个端口号来模拟这个实验.如果有条件肯定是多台服务器更好.

启动memcached时候后面参数的意义

-m告诉memcached使用多大的RAM来进行存储,单位是MB。这个数字并不是严格意义上的最大值,memcached可能会在此之上增加一些内存使用
-d告诉mecached以守护进程的方式启动

如果通过initscript的方式启动memcached,可以忽略这个参数

第一次启动时可以忽略这个参数
-v告诉memcached运行时,打印标准输出STDOUT/STDERR

一个v只打印启动信息

多个v可以打印出来缓存命中的情况

在测试环境下,在前台打印输出信息是个不错的选择
-p指定启动实例的端口号,默认11211

实际的应用中,使用分布式Memcached的时候,应用每台PC部署一个实例,但是在学习测试环境下,可以在同一台PC上开启多个实例,只要端口号不冲突就可以
5.spymemcached使用

这个是一个基于原生NIO模型的工具.能够实现异步的加载数据.

5.1基本API用法
Spymemcached的使用方法比较简单
(1)MemcachedClient构造函数需要提供Server列表。
(2)对于基本操作都有对应的API,例如

存储相关

add添加一组KV对

OperationFuture<Boolean>add(Stringkey,intexp,Objecto)

第二个参数exp代表KV对的有效期

(1)以秒为单位的有效时间,最大是30天,如果超过了30天,会被认为是(2)

(2)距离1970/01/01的以秒为单位的时间

搜索的存储操作都是异步请求

通过返回的Future对象,可以判断处理的结果

set添加或者覆盖一组KV对,其他同add
replace覆盖一组KV对,其他同add
touchASCII协议不支持

仅二进制协议支持
incr

decr
在对应的Key的value上增加/减少

注意,储存的value不能是Integer或者Long形式的数字

必须是String形式的数字字符串"123"
delete删除
检索相关

get同步检索K,返回value
asyncGet异步检索K
Gets检索V的同时返回cas值

结果包装在CASValue中
cas这个方法其实就是cas模式的replace

会分为3种不同的情况

OK-操作成功

NOT_FOUND-操作的Key不存在,这时候不会进行额外的add操作

EXISTS-Key存在,但是提交的cas已经发生了改变,不发生变化
asyncCAS异步版本cas
getBulk批量读取

返回的是Map<String,Object>
其他

getSats获得参数
getUnavailableServers获取当前可用Server
getVersions获取memcached版本
flush清空缓存
6.简单的test
使用maven依赖包引入



<dependency>
<groupId>com.google.code.simple-spring-memcached</groupId>
<artifactId>spymemcached</artifactId>
<version>2.8.4</version>
</dependency>


packagecom.heinz.memcached.memcached;
importjava.io.IOException;
importjava.io.Serializable;
importjava.net.InetSocketAddress;
importjava.util.concurrent.ExecutionException;
importnet.spy.memcached.MemcachedClient;
publicclassMemcachedTest{
publicstaticvoidmain(String[]args)throwsIOException{
//模拟三个服务器
MemcachedClientc=newMemcachedClient(
newInetSocketAddress("192.168.216.133",11211),
newInetSocketAddress("192.168.216.133",11212),
newInetSocketAddress("192.168.216.133",11213));
//放入100个key/value
for(inti=0;i<100;i++){
c.set("key"+i,10000,newInteger(i));
}
longstart=System.currentTimeMillis();
try{
//尝试使用异步的get方法获取
for(inti=0;i<100;i++){
System.out.println(c.asyncGet("key"+i).get());
}
System.out.println("---------------");
//使用CAS(CheckAndSet)保持一致性的修改方式
for(inti=0;i<100;i++){
c.asyncCAS("key"+i,c.asyncGets("key"+i).get().getCas(),i+i);
}
//异步的获取方式
for(inti=0;i<100;i++){
System.out.println(c.asyncGet("key"+i).get());
}
}catch(InterruptedExceptione){
e.printStackTrace();
}catch(ExecutionExceptione){
e.printStackTrace();
}
longend=System.currentTimeMillis();
System.out.println("用了时间:"+(end-start));
//这里尝试存放一个对象
Useru1=newUser();
u1.userName="heinz_ho";
u1.password="123";
c.set("user1",3600,u1);
System.out.println(c.get("user1"));
}
}
//必须将对象序列化才能保存
classUserimplementsSerializable{
//瞬时性直接打印null
publictransientStringuserName;
publicStringpassword;
publictransientintid=1;
publictransientintid2;
@Override
publicStringtoString(){
returnuserName+password+id+id2;
}
}


小结:

spymemcached背后的nio模型可能要好好看透,主要是没有发现使用的场景,只能简单的当成跟同步的

缓存来用了.同时这个工具有spring的工具包,有空可以一起搞掉.

参考:<http://isuifengfei.iteye.com/blog/1677704>
这一篇确实写得非常好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: