介绍
memcached
免费和开源,高性能,分布式的内存对象缓存系统,通用性,可用于加速动态Web应用程序,减轻数据库负载。
memcached是一个在任意的数据块存储键值存储(字符串,对象)从数据库调用,API调用结果,或页面 渲染。
memcached是简单但功能强大的。其简单的设计促进快速部署,易于开发,并解决了许多问题,面临巨大的数据高速缓存。它的API是最流行的语言。
下载:http://memcached.org/downloads
安装
memcached-1.2.6-win32-bin
安装目录命令行:
memcached -d install
卸载:
memcached -d uninstall
启动
启动1.界面启动服务(memcached Server)
启动2:控制台下 : memcached -d start
需要的内存大于64m启动:memcached -m 256m -d stat
Lest Recently Used(LRU)大于内存时自己删除不用的
检查: 默认端口11211
netstat -anb 查看端口和占用程序
使用方法登录:
telnet localhost 11211
命令:
ADD key 标志 时间 字节数
如果已存在就不能保存
add name 0 60 5[add指令;name是key(key/value);0是标志;60表示存放时间60s ; 5表示放入多大字节]
ADD key 标志 时间 字节数
value必须和字节数大小一样不然报:CLIENT_ERROR bad data chunk
GET [key] name
例:
add name 0 60 5
hello
STORED
get name
VALUE name 0 5
hello
END
SET key 标志 时间 字节数
更新key不存在就插入,存在就更新
get age
VALUE age 0 3
100
END
set age 0 60 3
123
STORED
get age
VALUE age 0 3
123
END
DELETE key 删除key
delete age3
DELETED
get age3
END
REPLACE key 标志 时间 字节数
replace test 0 5 3 --替换test的定义
替换key之前的定义
add test 0 500 3
100
STORED
replace test 0 5 3
120
STORED
get test
VALUE test 0 3
120
END
get test
END
APPEND key 标志 时间 字节数
append name 0 60 3--在字符串后追加
add name 0 60 5
hello
STORED
append name 0 60 3
abc
STORED
get name
VALUE name 0 8
helloabc
END
INCR key 加值
incr count 1
增加数值
get count
VALUE count 0 2
10
END
incr count 1
11
get count
VALUE count 0 2
11
END
DECR key 减值
decr key 1
get count
VALUE count 0 2
11
END
decr count 1
10
get count
VALUE count 0 2
10
END
flush_all
全删
flush_all 50
50秒以内到期的全删掉
stats
查看状态
STAT pid 22459 进程ID
STAT uptime 1027046 服务器运行秒数
STAT time 1273043062 服务器当前unix时间戳
STAT version 1.4.4 服务器版本
STAT pointer_size 64 操作系统字大小(这台服务器是64位的)
STAT rusage_user 0.040000 进程累计用户时间
STAT rusage_system 0.260000 进程累计系统时间
STAT curr_connections 10 当前打开连接数
STAT total_connections 82 曾打开的连接总数
STAT connection_structures 13 服务器分配的连接结构数
STAT cmd_get 54 执行get命令总数
STAT cmd_set 34 执行set命令总数
STAT cmd_flush 3 指向flush_all命令总数
STAT get_hits 9 get命中次数
STAT get_misses 45 get未命中次数
STAT delete_misses 5 delete未命中次数
STAT delete_hits 1 delete命中次数
STAT incr_misses 0 incr未命中次数
STAT incr_hits 0 incr命中次数
STAT decr_misses 0 decr未命中次数
STAT decr_hits 0 decr命中次数
STAT cas_misses 0 cas未命中次数
STAT cas_hits 0 cas命中次数
STAT cas_badval 0 使用擦拭次数
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 15785 读取字节总数
STAT bytes_written 15222 写入字节总数
STAT limit_maxbytes 1048576 分配的内存数(字节)
STAT accepting_conns 1 目前接受的链接数
STAT listen_disabled_num 0
STAT threads 4 线程数
STAT conn_yields 0
STAT bytes 0 存储item字节数
STAT curr_items 0 item个数
STAT total_items 34 item总数
STAT evictions 0 为获取空间删除item的总数
version
查看版本
quit
退出登录
Memcached-Java-Client
下载地址:https://github.com/gwhalin/Memcached-Java-Client测试类:
package junit.memcache;
import java.util.Date;
import com.meetup.memcached.MemcachedClient;
import com.meetup.memcached.SockIOPool;
/**
*
* @author Daniel memcache测试
*/
public class SimpleMemcacheDB {
protected static MemcachedClient cache = new MemcachedClient();
protected static SockIOPool pool = null;
/**
* 配置数据源
*/
static {
// memcache集
String[] servers = { "192.168.1.33:11211" };
Integer[] weights = { 5, 4, 2 };// memcache权重
pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setWeights(weights);
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(50);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.initialize();
System.out.println("初始化完成");
}
/**
* 测试方法:测试string和object类型
*/
public void test() throws Exception{
// 清空所有数据,谨慎使用
cache.flushAll();
// 对象测试
// 保存 object 类型,类必须实现Serializable接口
for (int i = 1; i < 10; i++) {
// 过期时间10s
cache.set("obj" + i, new User(i + ""), new Date(10000));
}
for (int i = 1; i < 2; i++) {
User myObject = (User) cache.get("obj" + i);
System.out.println("Get object from mem :" + myObject);
}
// 字符串和过期测试
// 过期时间1s
cache.set("testKey", "This is a test String", new Date(1000));
System.out.println("get String:"+cache.get("testKey"));
//sleep 2.5s
Thread.sleep(2500);
System.out.println("get String过期后:"+cache.get("testKey"));
//3600s
cache.set("TestReplace", "TestReplaceValue",new Date(3600000));
System.out.println(cache.get("TestReplace"));
//修改过期时间
cache.replace("TestReplace","TestReplaceValue",new Date(2000));
//sleep 2.5s
Thread.sleep(2500);
System.out.println("修改后不能获得:"+cache.get("TestReplace"));
}
}
User.java
package junit.memcache;
import java.io.Serializable;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
String userId;
public User(String userId) {
super();
this.userId = userId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
@Override
public String toString() {
return "User [userId=" + userId + "]";
}
}
注意: 如果java程序和memcache不在一个服务器,那么注意时间同步问题。我这里就是一直访问不到设置短期的数据,后来发现两个服务器时间没有同步
存的类需要序列化实现Serializable接口
下载的源代码里有个不错的多线程多服务器的测试demo可以看一下:com.meetup.memcached.test.TestMemcached