介绍
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 chunkGET [key] name例:
add name 0 60 5
hello
STORED
get name
VALUE name 0 5
hello
ENDSET key 标志 时间 字节数
更新key不存在就插入,存在就更新
get age
VALUE age 0 3
100
END
set age 0 60 3
123
STORED
get age
VALUE age 0 3
123
ENDDELETE key 删除key
delete age3
DELETED
get age3
ENDREPLACE 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
ENDAPPEND 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
ENDINCR key 加值
incr count 1
增加数值
get count
VALUE count 0 2
10
END
incr count 1
11
get count
VALUE count 0 2
11
ENDDECR key 减值
decr key 1
get count
VALUE count 0 2
11
END
decr count 1
10
get count
VALUE count 0 2
10
ENDflush_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 &#61; new MemcachedClient();protected static SockIOPool pool &#61; null;/*** 配置数据源*/static {// memcache集String[] servers &#61; { "192.168.1.33:11211" };Integer[] weights &#61; { 5, 4, 2 };// memcache权重pool &#61; 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("初始化完成");}/*** 测试方法&#xff1a;测试string和object类型*/public void test() throws Exception{// 清空所有数据&#xff0c;谨慎使用cache.flushAll();// 对象测试// 保存 object 类型&#xff0c;类必须实现Serializable接口for (int i &#61; 1; i <10; i&#43;&#43;) {// 过期时间10scache.set("obj" &#43; i, new User(i &#43; ""), new Date(10000));}for (int i &#61; 1; i <2; i&#43;&#43;) {User myObject &#61; (User) cache.get("obj" &#43; i);System.out.println("Get object from mem :" &#43; myObject);}// 字符串和过期测试// 过期时间1scache.set("testKey", "This is a test String", new Date(1000));System.out.println("get String:"&#43;cache.get("testKey"));//sleep 2.5sThread.sleep(2500);System.out.println("get String过期后:"&#43;cache.get("testKey"));//3600scache.set("TestReplace", "TestReplaceValue",new Date(3600000));System.out.println(cache.get("TestReplace"));//修改过期时间cache.replace("TestReplace","TestReplaceValue",new Date(2000)); //sleep 2.5sThread.sleep(2500);System.out.println("修改后不能获得:"&#43;cache.get("TestReplace")); }}
User.java
package junit.memcache;import java.io.Serializable;public class User implements Serializable{/*** */private static final long serialVersionUID &#61; 1L;String userId;public User(String userId) { super(); this.userId &#61; userId; } public String getUserId() {return userId;}public void setUserId(String userId) {this.userId &#61; userId;}&#64;Overridepublic String toString() {return "User [userId&#61;" &#43; userId &#43; "]";} }
注意&#xff1a;
如果java程序和memcache不在一个服务器&#xff0c;那么注意时间同步问题。我这里就是一直访问不到设置短期的数据&#xff0c;后来发现两个服务器时间没有同步
存的类需要序列化实现Serializable接口
下载的源代码里有个不错的多线程多服务器的测试demo可以看一下&#xff1a;com.meetup.memcached.test.TestMemcached