你的位置:首页 > Java教程

[Java教程]分布式缓存memcached介绍,win7环境安装,常用命令set,get,delete,stats, java访问


 分布式缓存memcached介绍,win7环境安装,常用命令set,get,delete,stats,java访问

一、memcached是什么?

二、memcached不互相通信的分布式

三、安装步骤

四、本文介绍的命令主要包括:

  1. 存入命令(Storage commands)
  2. 取回命令(Retrieval command)
  3. 删除命令(Deletion)
  4. 统计(Statistics)
  5. 其他命令

 五、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 pid22459                            进程ID 
STAT uptime1027046                       服务器运行秒数 
STAT time1273043062                      服务器当前unix时间戳 
STAT version1.4.4                        服务器版本 
STAT pointer_size64                      操作系统字大小(这台服务器是64位的) 
STAT rusage_user0.040000                 进程累计用户时间 
STAT rusage_system0.260000               进程累计系统时间 
STAT curr_connections10                  当前打开连接数 
STAT total_connections82                 曾打开的连接总数 
STAT connection_structures 13             服务器分配的连接结构数 
STAT cmd_get54                           执行get命令总数 
STAT cmd_set34                           执行set命令总数 
STAT cmd_flush3                          指向flush_all命令总数 
STAT get_hits9                           get命中次数 
STAT get_misses45                        get未命中次数 
STAT delete_misses5                      delete未命中次数 
STAT delete_hits1                        delete命中次数 
STAT incr_misses0                        incr未命中次数 
STAT incr_hits0                          incr命中次数 
STAT decr_misses0                        decr未命中次数 
STAT decr_hits0                          decr命中次数 
STAT cas_misses 0    cas未命中次数 
STAT cas_hits0                           cas命中次数 
STAT cas_badval0                         使用擦拭次数 
STAT auth_cmds 0 
STAT auth_errors 0 
STAT bytes_read15785                     读取字节总数 
STAT bytes_written15222                  写入字节总数 
STAT limit_maxbytes1048576               分配的内存数(字节) 
STAT accepting_conns1                    目前接受的链接数 
STAT listen_disabled_num0                 
STAT threads4                            线程数 
STAT conn_yields 0 
STAT bytes0                              存储item字节数 
STAT curr_items0                         item个数 
STAT total_items34                       item总数 
STAT evictions0                          为获取空间删除item的总数 

5.其他命令

flush_all该命令有一个可选的数字参数。它总是执行成功,服务器会发送 “OK\r\n” 回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。 flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行(这是由memcached的懒惰检测和删除机制决定的)。

flush_all 效果是它导致所有更新时间早于 flush_all 所设定时间的项目,在被执行取回命令时命令被忽略。

 

 五、java客户端访问

maven

<!-- 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)

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