分布式缓存memcached介绍,win7环境安装,常用命令set,get,delete,stats, java访问
一、memcached是什么?
二、memcached不互相通信的分布式
三、安装步骤
四、本文介绍的命令主要包括:
- 存入命令(Storage commands)
- 取回命令(Retrieval command)
- 删除命令(Deletion)
- 统计(Statistics)
- 其他命令
五、java客户端访问
一、 memcached是什么?
memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、 hatena、 Facebook、 Vox、LiveJournal等众多服务中 提高Web应用扩展性的重要因素。
许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。
这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。
二、 memcached不互相通信的分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。
三、安装步骤 (我这里因为是win7系统,为了便于测试,安装的是windows 64bit版本)
1、 从http://pan.baidu.com/s/1sk7lNgp 下载,解压到指定目录,如:C:\Users\Admin\Desktop\memcached-win64-1.4.4-14\memcached
2、 用cmd打开命令窗口,转到解压的目录,输入 “memcached.exe -d install”。
3、打开控制面板,打开服务,可以看到memcached已经在上面,如果没有启动,则手动启动一下。
四、 本文介绍的命令主要包括:
1.存入命令(Storage commands)
<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n
cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n
<command name> 是"set", "add", "replace", "append" 或者"prepend"
key 长度最长不能超过250 characters
set 命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
add 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应NOT_STORED。
replace 仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应。
Append 将此数据添加到现有数据后的现有key中
prepend 将此数据添加到现有数据前的现有key中
append和prepend命令不接受flags或exptime。他们更新现有的数据部分,而忽略了新的flag和exptime设置。
cas是一个check和set操作,这意味着, 存储这些数据,但在我访问过此数据后,再没有其他人更新。
<key>用于查找缓存值
<flags>可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
<exptime>在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
<bytes>在缓存中存储的字节点
<cas unique> 一个存在的64bit的entry值。这个值是客户端使用gets返回的值。
"noreply" 这是一个可选参数,服务端不会发送回复。
在这一行之下,是客户端要发送给服务端进行缓存的数据。
<data block>\r\n
<data block> 存储的数据块(可直接理解为key-value结构中的value)
实例操作:
可以看到我保存了carl到username中,结果是STORED。表示存储成功。
2.取回命令(Retrieval command)
get <key>*\r\n
gets <key>*\r\n
<key>* 是一个或多个被空格分开的字符串
返回的结果是0到多个items。存储的数据会被显示出来。结尾是一个
"END\r\n"
3.删除命令(Deletion)
delete <key> [noreply]\r\n
<key> 是客户端想要删除的服务端的缓存的key值
4.统计(Statistics)
stats 命令的功能正如其名:转储所连接的 memcached 实例的当前统计数据。在下例中,执行 stats 命令显示了关于当前 memcached 实例的信息:
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的总数
5.其他命令
flush_all该命令有一个可选的数字参数。它总是执行成功,服务器会发送 “OK\r\n” 回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。 flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行(这是由memcached的懒惰检测和删除机制决定的)。
flush_all 效果是它导致所有更新时间早于 flush_all 所设定时间的项目,在被执行取回命令时命令被忽略。
五、java客户端访问
所依赖的主要jar包
maven配置pom.xml
<!-- memcached client --> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>spymemcached</artifactId> <version>2.8.4</version> </dependency>
java客户端测试代码(参考自文章:http://blog.csdn.net/arui_email/article/details/8129400)
另外大家也可以参考这篇文章http://blog.csdn.net/seelye/article/details/8511073
package com.carl.carlapp.memcached; import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.MemcachedClient; public class TestSpyMemcache { public static void main(String[] args) { // 保存对象 try { /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */ MemcachedClient mc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); Future<Boolean> b = null; /* 将key值,过期时间(秒)和要缓存的对象set到memcached中 */ b = mc.set("neea:testDaF:ksIdno", 900, "someObject"); if (b.get().booleanValue() == true) { mc.shutdown(); } } catch (Exception ex) { ex.printStackTrace(); } // 取得对象 try { /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */ MemcachedClient mc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); /* 按照key值从memcached中查找缓存,不存在则返回null */ Object b = mc.get("neea:testDaF:ksIdno"); System.out.println(b.toString()); mc.shutdown(); } catch (Exception ex) { ex.printStackTrace(); } } }
结果:
someObject
使用telnet 结果:
-----------------------------------------------------------------------
官方网站:http://www.memcached.org/
Github源代码: https://github.com/memcached/memcached
帮助文档:https://github.com/memcached/memcached/blob/master/doc/protocol.txt
另外,可以参考如下的博客
相关链接:
Memcached笔记——(一)安装&常规错误&监控
Memcached笔记——(二)XMemcached&Spring集成
Memcached笔记——(三)Memcached使用总结
Memcached笔记——(四)应对高并发攻击
你要坚强,坚强的足以认识自己的弱点;你要勇敢,勇敢的足以面对自己的恐惧;你要堂堂正正。在遇到挫折时能够昂首而不背躬屈膝;你要能够面对掌声,在胜利时能够谦逊而不趾高气扬。真正的伟大直率真诚,真正的贤人虚怀若谷,真正的强者温文尔雅。——萨利·布什(林肯的继母教育林肯)