memcached常用语法及java使用方式
Author:SimpleWu
Memcached 存储命令
Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
set key flags exptime bytes [noreply]
value
Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
add key flags exptime bytes [noreply]
value
Memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。
replace key flags exptime bytes [noreply]
value
Memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。
append key flags exptime bytes [noreply]
value
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
prepend key flags exptime bytes [noreply]
value
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作
它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。
cas key flags exptime bytes unique_cas_token [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- unique_cas_token通过 gets 命令获取的一个唯一的64位值。
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
Memcached 查找命令
Memcached get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
get key
多个 key 使用空格隔开
get key1 key2 key3
Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。
gets key
多个 key 使用空格隔开
gets key1 key2 key3
Memcached delete 命令用于删除已存在的 key(键)。
delete key [noreply]
Memcached 统计命令
Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。
stats
结果:
这里显
stats
STAT pid 1162
STAT uptime 5022
STAT time 1415208270
STAT version 1.4.14
STAT libevent 2.0.19-stable
STAT pointer_size 64
STAT rusage_user 0.096006
STAT rusage_system 0.152009
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 6
STAT cmd_set 4
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 4
STAT get_misses 2
STAT delete_misses 1
STAT delete_hits 1
STAT incr_misses 2
STAT incr_hits 1
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 262
STAT bytes_written 313
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 1
STAT evicted_unfetched 0
STAT bytes 142
STAT curr_items 2
STAT total_items 6
STAT evictions 0
STAT reclaimed 1
END
示了很多状态信息,下边详细解释每个状态项:
- pid: memcache服务器进程ID
- uptime:服务器已运行秒数
- time:服务器当前Unix时间戳
- version:memcache版本
- pointer_size:操作系统指针大小
- rusage_user:进程累计用户时间
- rusage_system:进程累计系统时间
- curr_connections:当前连接数量
- total_connections:Memcached运行以来连接总数
- connection_structures:Memcached分配的连接结构数量
- cmd_get:get命令请求次数
- cmd_set:set命令请求次数
- cmd_flush:flush命令请求次数
- get_hits:get命令命中次数
- get_misses:get命令未命中次数
- delete_misses:delete命令未命中次数
- delete_hits:delete命令命中次数
- incr_misses:incr命令未命中次数
- incr_hits:incr命令命中次数
- decr_misses:decr命令未命中次数
- decr_hits:decr命令命中次数
- cas_misses:cas命令未命中次数
- cas_hits:cas命令命中次数
- cas_badval:使用擦拭次数
- auth_cmds:认证命令处理的次数
- auth_errors:认证失败数目
- bytes_read:读取总字节数
- bytes_written:发送总字节数
- limit_maxbytes:分配的内存总大小(字节)
- accepting_conns:服务器是否达到过最大连接(0/1)
- listen_disabled_num:失效的监听数
- threads:当前线程数
- conn_yields:连接操作主动放弃数目
- bytes:当前存储占用的字节数
- curr_items:当前存储的数据总数
- total_items:启动以来存储的数据总数
- evictions:LRU释放的对象数目
- reclaimed:已过期的数据条目来存储新数据的数目
Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。
stats items
结果:
stats items
STAT items:1:number 1
STAT items:1:age 7
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
Memcached flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对。
该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。
flush_all [time] [noreply]
JAVA连接使用Memcached 服务
要使用Java连接memcached服务,一般常见的有两种方式:
- 使用Memcached-Java-Client方式(官方提供)
- 使用spymemcached方式
两种方式的对比:
Memcached-Java-Client方式,较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。
spymemcached方式,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。?
项目中加入spymemcached依赖
<!-- spymemcached -->
<dependency>
<groupId>com.google.code.simple-spring-memcached</groupId>
<artifactId>spymemcached</artifactId>
<version>2.8.4</version>
</dependency>
spymemcached操作memcache,连接memcached服务器,并写入数据,检索出数据。
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
//添加memcached的服务的地址和端口号
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 11211);
//创建memcachedClient客户端连接对象
MemcachedClient client = new MemcachedClient(address);
//存储数据
@SuppressWarnings("rawtypes")
Future future = client.set("SimpleWu", 900, "lovelyWu98k@gmail.com");
//查看存储状态
System.out.println("status:" + future.get());
//输出值
System.out.println("value in cache:" + client.get("SimpleWu"));
//client.delete("hello"); //删除
//client.flushall(); //清除所有数据
client.shutdown(); //关闭连接
}
同样使用Maven来导入Memcached-Java-Client的jar包。
<!-- Memcached-Java-Client -->
<dependency>
<groupId>com.whalin</groupId>
<artifactId>Memcached-Java-Client</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
</dependency>
使用Memcached-java-client操作memcached服务器。添加数据到memcached,然后检索出数据。
public static void main(String[] args) {
SockIOPool pool = SockIOPool.getInstance(); //创建memcache连接池
String[] addresses = { "127.0.0.1:11211" }; //服务器地址,可以添加多个
Integer[] weights = {3}; //添加权重
pool.setServers(addresses); //服务器地址
pool.setWeights(weights); //权重信息
pool.setInitConn( 5 ); //初始连接数
pool.setMinConn( 5 ); //最小连接数
pool.setMaxConn( 250 ); //最大连接数
pool.setMaxIdle( 1000 * 60 * 60 * 6 ); //最大处理时间。
pool.setMaintSleep( 30 ); // 设置主线程的睡眠时间
pool.setNagle(false); //是否缓冲
pool.setSocketTO(3000); //Socket阻塞读取数据的超时时间
pool.setSocketConnectTO(0); //连接建立时对超时的控制
pool.initialize(); //初始化
MemCachedClient client = new MemCachedClient(); // 使用MemCacheClient
client.add("SimpleWu", "lovelyWu98k@gmail.com"); // 添加
System.out.println(client.get("SimpleWu"));
client.delete("hello"); // 删除
client.flushAll(); // 清空
}
java具体命令使用参考
适用场合
- 分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。
- 数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。
- 服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统登录系统将登录信息缓存起来,服务器呢?这时候,我们便可以使用memcached,查询系统便可以获得登录信息,就像获取本地信息一样。
不适用的场合
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源