memcached 配置-使用-java结合

来源:互联网 发布:java json解析 编辑:程序博客网 时间:2024/05/22 11:43
1.总览
  • 安装memcached  单节点/多节点
  • memcached 中的简单命令 
  • 多个节点memcached 
  • spymemcached ---memcached java client 的使用 
  • 一个简单的例子程序

2.简单 安装memcached 
一句话安装好memcached ...
# yum install memcached
启动memcached 的步骤.


通过telnet 可以简单的测试一下memcached 的服务
localhost : 可以改成 远程的ip 地址
11211 :默认的端口号
# telnet localhost 11211


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

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

储存命令(Storage Commands)
set添加或者覆盖一个Key,新的item放在LRU的顶端add添加一个Keyreplace覆盖一个keyappend在一个已有的Key的Value后面追加数据
prepend在一个已有的Key的Value前面添加数据casCheck-and-Set 或者叫 Compare-and-Swap,当数据等于指定值的时候,再对Key对应的value进行修改,
主要用于解决竞争条件
 


4.多个节点memcached 
单机情况下使用多个端口号来模拟多个节点的memcached
memcached -d -p 11212 -u nobody -c 1024 -m 64
memcached -d -p 11213 -u nobody -c 1024 -m 64
开启了两个端口号来模拟这个实验. 如果有条件肯定是多台服务器更好.

启动memcached 时候后面参数的意义 
-m告诉memcached使用多大的RAM来进行存储,单位是MB。这个数字并不是严格意义上的最大值,memcached可能会在此之上增加一些内存使用-d告诉mecached以守护进程的方式启动
如果通过init script的方式启动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(String key, int exp, Object o)

第二个参数exp代表KV对的有效期
(1)以秒为单位的有效时间,最大是30天,如果超过了30天,会被认为是(2)
(2)距离1970/01/01的以秒为单位的时间

搜索的存储操作都是异步请求
通过返回的Future对象,可以判断处理的结果

set添加或者覆盖一组KV对,其他同addreplace覆盖一组KV对,其他同addtouchASCII协议不支持
仅二进制协议支持
incr
decr
在对应的Key的value上增加/减少
注意,储存的value不能是Integer或者Long形式的数字
必须是String形式的数字字符串"123"
delete删除

检索相关
get同步检索K,返回valueasyncGet异步检索KGets检索V的同时返回cas值
结果包装在CASValue中
cas这个方法其实就是cas模式的replace
会分为3种不同的情况
OK - 操作成功
NOT_FOUND - 操作的Key不存在,这时候不会进行额外的add操作
EXISTS - Key存在,但是提交的cas已经发生了改变,不发生变化
asyncCAS异步版本casgetBulk批量读取
返回的是Map<String,Object>


其他
getSats获得参数getUnavailableServers获取当前可用ServergetVersions获取memcached版本flush清空缓存



6.简单的test
使用maven 依赖包引入
<dependency>
<groupId>com.google.code.simple-spring-memcached</groupId>
<artifactId>spymemcached</artifactId>
<version>2.8.4</version>
</dependency>
package com.heinz.memcached.memcached;
 
import java.io.IOException;
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutionException;
 
import net.spy.memcached.MemcachedClient;
 
public class MemcachedTest {
public static void main(String[] args) throws IOException {
//模拟三个服务器
MemcachedClient c = new MemcachedClient(
new InetSocketAddress("192.168.216.133", 11211),
new InetSocketAddress("192.168.216.133", 11212),
new InetSocketAddress("192.168.216.133", 11213));
//放入100个 key/value
for(int i=0;i<100;i++){
c.set("key"+i, 10000, new Integer(i));
}
long start =System.currentTimeMillis();
try {
//尝试使用异步的get 方法获取
for(int i=0;i<100;i++){
System.out.println(c.asyncGet("key"+i).get());
}
System.out.println("---------------");
//使用CAS(Check And Set)保持一致性 的修改方式
for(int i=0;i<100;i++){
c.asyncCAS("key"+i, c.asyncGets("key"+i).get().getCas(), i+i);
}
//异步的获取方式
for(int i=0;i<100;i++){
System.out.println(c.asyncGet("key"+i).get());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("用了时间:"+ (end-start));
//这里尝试存放一个对象
User u1 = new User();
u1.userName = "heinz_ho";
u1.password = "123";
c.set("user1",3600,u1);
System.out.println(c.get("user1"));
}
 
}
 
//必须将对象序列化才能保存
class User implements Serializable{
//瞬时性直接打印null
public transient String userName;
public String password;
public transient int id = 1;
public transient int id2 ;
@Override
public String toString() {
return userName + password +id + id2;
}
}



小结:
spymemcached 背后的nio模型 可能要好好看透, 主要是没有发现使用的场景 , 只能简单的当成跟同步的
缓存来用了. 同时这个工具有spring 的工具包 , 有空可以一起搞掉.



 参考 :<http://isuifengfei.iteye.com/blog/1677704> 这一篇确实写得非常好

0 0
原创粉丝点击