memcached 是一个高效的分布式的内存对象缓存系统 ,他可以支持把各种数据(数组,对象,基本数据类型,资源除外)放入到它管理的内存中。它采用c/s结构,使用简单文本通讯并基于libevent处理并发,将数据存入内存的缓存工具,它是基于基于客户端的分布式,服务器端本身并不是分布式的。

 

Memcache(Memcached)是集群环境下的缓存解决方案。  它是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。

win32系统下的安装步骤:
①下载memcached软件
②解压 其中有一个memcached.exe文件
③安装memcached –d install [卸载使用 memcached -d uninstall]
④启动 memcached 服务
(1)直接通过界面启动该服务
(2)在控制台下启动 memcached –d start   [命令一览表]
⑤查看memcached 服务是否启动成功! 默认端口11211 通过netstat -anb命令可以查看
memcached的基本命令(安装、卸载、启动、配置相关):
-p 监听的端口 
-l 连接的IP地址, 默认是本机  
-d start 启动memcached服务 
-d restart 重起memcached服务 
-d stop|shutdown 关闭正在运行的memcached服务 
-d install 安装memcached服务 
-d uninstall 卸载memcached服务 
-u 以的身份运行 (仅在以root运行的时候有效) 
-m 最大内存使用,单位MB。默认64MB 
-M 内存耗尽时返回错误,而不是删除项 
-c 最大同时连接数,默认是1024 
-f 块大小增长因子,默认是1.25 
-n 最小分配空间,key+value+flags默认是48 
-h 显示帮助 
2、 如果在安装时没有添加参数,可通过修改注册表信息进行设置,打开注册表,找
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached
在其中有一个“ImagePath”项,值为:
"C:\Memcached\memcached-win32-1.4.4-14\memcached.exe" -d runservice
在后面加上“-m 1024 -c2048”。

命令行分别输入 memcached -d stop 和 net start "Memcached Server" 命令可以卸载已安装的memcached
注意:win7下的通过控制台安装必须 启用管理员权限启动命令行窗口才可以运行命令。
使用方法一:
telnet的使用(win7下默认情况telnet没有开启,需要在控制面板-->程序和功能,中通过打开或关闭功能,开题telnet即可开启telnet)
telnet://ip 11211即可对memcache进行远程操作。
使用方法二:
通过java客户端api的方式。
采用了spymemcached  下载地址:http://spymemcached.googlecode.com/  它依赖 spy.jar,spy.jar的下载地址:http://bleu.west.spy.net/~dustin/repo/spy/jars/spy-2.4.jar

Java代码 name=client.asyncGet("name"); //这里是异步操作,如果出现了 服务器端超时,则可以抛出异常,否则会阻塞 try { System.out.println(name.get(5, TimeUnit.SECONDS)); } catch (InterruptedException e) { System.out.println(e.getMessage()); } catch (TimeoutException e) { System.out.println(e.getMessage()); } catch (ExecutionException e) { System.out.println(e.getMessage()); } client.shutdown(); } } " quality="high" > 

  1. public class MemcacheTest {  

  2.     public static void main(String[] args) {  

  3.         MemcachedClient client=null;  

  4.         try {  

  5.             client = new MemcachedClient(new InetSocketAddress("localhost",11211));  

  6.         } catch (IOException e) {  

  7.             System.out.println(e.getMessage());  

  8.         }  

  9.         client.add("name"60"小明");  

  10.         GetFuture name=client.asyncGet("name");  

  11.                 //这里是异步操作,如果出现了 服务器端超时,则可以抛出异常,否则会阻塞  

  12.         try {  

  13.             System.out.println(name.get(5, TimeUnit.SECONDS));  

  14.         } catch (InterruptedException e) {  

  15.             System.out.println(e.getMessage());  

  16.         } catch (TimeoutException e) {  

  17.             System.out.println(e.getMessage());  

  18.         } catch (ExecutionException e) {  

  19.             System.out.println(e.getMessage());  

  20.         }  

  21.         client.shutdown();  

  22.     }  

  23. }  

 memcached的基本命令(memcached 启动后用于对memcached管理的数据和本身运行状态相关的命令)

Command

Description

Example

get

Reads a value

get mykey

set

Set a key unconditionally

set mykey 0 60 5

add

Add a new key

add newkey 0 60 5

replace

Overwrite existing key

replace key 0 60 5

append

Append data to existing key

append key 0 60 15

prepend

Prepend data to existing key

prepend key 0 60 15

incr

Increments numerical key value by given number

incr mykey 2

decr

Decrements numerical key value by given number

decr mykey 5

delete

Deletes an existing key

delete mykey

flush_all

Invalidate specific items immediately

flush_all

Invalidate all items in n seconds

flush_all 900

stats

Prints general statistics

stats

Prints memory statistics

stats slabs

Prints memory statistics

stats malloc

Print higher level allocation statistics

stats items

stats detail

stats sizes

Resets statistics

stats reset

version

Prints server version.

version

verbosity

Increases log level

verbosity

quit

Terminate telnet session

quit

 

 

========关于日志部份,应该跟linux一样,下面是linux环境下的,win也是这样================

memcache在linux上安装时并不支持显示地配置服务日志,我们如果想要把memcache服务日志保存到日志文件中,则需要在启动参数中进行配置。

 

安装好memcache后,我们可以通过-h命令查看memcached支持的参数:

Shell代码  

  1. [chenzhou@localhost ~]$ /usr/local/memcached/bin/memcached -h  

  2. #其余的省略  

  3. -v            verbose (print errors/warnings while in event loop)  

  4. -vv           very verbose (also print client commands/reponses)  

  5. -vvv          extremely verbose (also print internal state transitions)  

从上面可以看到,启动memcached时有3个参数是和日志信息相关的:

其中-v代表打印普通的错误或者警告类型的日志信息

-vv比-v打印的日志更详细,包含了客户端命令和server端的响应信息

-vvv则是最详尽的,甚至包含了内部的状态信息打印

 

你可以根据你的实际需要来选择对应的参数,我这里使用-vv就OK了。

由于我们需要把日志信息保存在文件中,而不是在控制台输出,而-vv等参数只能把日志信息输出在控制台。所以我们需要对-vv参数的输出进行数据流重定向,关于重定向的知识在这里就不细述了,有兴趣的可以查下资料了解一下。

综上,启动memcached的命令如下:

 

Shell代码  

  1. /usr/local/memcached/bin/memcached -d -m 2048 -p $1 -u root -vv >> /tmp/memcached.log 2>&1  

重点在最后的:-vv >> /tmp/memcached.log 2>&1

 

-vv >> /tmp/memcached.log:代表把-vv的输出重定向到/tmp/memcached.log 文件中

2>&1的意思是把错误日志也一起写入到该文件中

 

启动成功后我们可以测试一下,首先起两个terminal,terminal1用来查看日志信息,terminal2进行client操作

terminal1:启动memcached后默认的日志信息如下

Shell代码  

  1. [chenzhou@localhost ~]$ tail -f /tmp/memcached.log   

  2. <<SPAN style="COLOR: rgb(192,0,0)" class=number>31 send buffer was 110592, now 268435456  

  3. <<SPAN style="COLOR: rgb(192,0,0)" class=number>30 server listening (udp)  

  4. <<SPAN style="COLOR: rgb(192,0,0)" class=number>31 server listening (udp)  

  5. <<SPAN style="COLOR: rgb(192,0,0)" class=number>30 server listening (udp)  

  6. <<SPAN style="COLOR: rgb(192,0,0)" class=number>31 server listening (udp)  

  7. <<SPAN style="COLOR: rgb(192,0,0)" class=number>30 server listening (udp)  

  8. <<SPAN style="COLOR: rgb(192,0,0)" class=number>30 server listening (udp)  

  9. <<SPAN style="COLOR: rgb(192,0,0)" class=number>31 server listening (udp)  

  10. <<SPAN style="COLOR: rgb(192,0,0)" class=number>31 server listening (udp)  

  11. <<SPAN style="COLOR: rgb(192,0,0)" class=number>32 new auto-negotiating client connection  

terminal2:往memcached里存入一个数据

Shell代码  

  1. [root@localhost bin]# telnet localhost 11211  

  2. Trying 127.0.0.1...  

  3. Connected to localhost.localdomain (127.0.0.1).  

  4. Escape character is '^]'.  

  5. set name 0 60 5 chenzhou  

如上所示:使用set命令存入key为name value为chenzhou

terminal1日志记录:

Shell代码  

  1. 32: Client using the ascii protocol  

  2. <<SPAN style="COLOR: rgb(192,0,0)" class=number>32 set name 0 60 5 chenzhou  

这样,我们的配置就生效了。