一 简介

1 What is Memcached?

Free & open source, high-performance, distributed memory object caching system, generic in nature,

but intended for use in speeding up dynamic web applications by alleviating 【减轻 缓解】 database load.

Memcached is an in-memory key-value store for small chunks 【块】

of arbitrary 【任意的】data (strings, objects) from results of database calls, API calls, or page rendering.

Memcached is simple yet powerful. Its simple design promotes uick deployment, ease of development,

and solves many problems facing large data caches. Its API is available for most popular languages.

memcached 是以 LiveJournal 旗下 Danga Interactive 公司 的 Brad Fitzpatric 为首开发的一款软件。

现在已成为 mixi、 hatena、 Facebook、 Vox、 LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。

许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。

但随着数据量的增大、 访问的集中, 就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。

这时就该 memcached 大显身手了。 memcached 是高性能的分布式内存缓存服务器。

一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、 提高可扩展性,如图。

Memcached是分布式的,也就是说它不是本地的。

它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。

2为什么会有Memcache和memcached两种名称

其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。

一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。

3.memcached的特征

memcached作为高速运行的分布式缓存服务器,具有以下的特点:

1)协议简单:memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。

1)基于libevent的事件处理:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。

即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

2)内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。

由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。

另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

3)memcached不互相通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。

各个memcached不会互相通信以共享信息。那么,分布式是完全取决于客户端的实现。

二 简单使用(windows 下)

1 下载文件

到http://code.jellycan.com/memcached/ 下载memcached的windows版

再下载一个java_memcached-release.jar

java_memcached-release_1.6.zip

memcached-1.2.1-win32.zip

2  解压memcached-1.2.1-win32.zip

D:\jt\memcached\memcached-1.2.1

3 启动

D:\jt\memcached\memcached-1.2.1:>memcached.exe -d install

D:\jt\memcached\memcached-1.2.1:>memcached.exe -l 127.0.0.1 -m 32 -d start

第一行是安装memcached成为服务,这样才能正常运行,否则运行失败!

执行后参看服务列表:

第二行是启动memcached的,作为测试我们就简单的只分配32M((默认64M))内存了,然后监听本机端口和以守护进行运行。

执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。

­p 使用的 TCP 端口 。 默认为 11211

­m 最大内存大小。 默认为 64M

­d 作为 daemon 在后台启动

2 java的使用

在java_memcached-release_1.6.zip中有java_memcached-release_1.6.jar

复制到java项目的lib目录下,然后我们来编写代码

 package com.jt.memcached.mem;

 import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool; /**
* 使用memcached的缓存实用类.
*/
public class MemCached { // 创建全局的唯一实例
protected static MemCachedClient mcc = new MemCachedClient(); protected static MemCached memCached = new MemCached(); // 设置与缓存服务器的连接池
static {
// 服务器列表和其权重
String[] servers = { "127.0.0.1:11211" };
Integer[] weights = { 3 }; // 获取socke连接池的实例对象
SockIOPool pool = SockIOPool.getInstance(); // 设置服务器信息
pool.setServers(servers);
pool.setWeights(weights); // 设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000 * 60 * 60 * 6); // 设置主线程的睡眠时间
pool.setMaintSleep(30); // 设置TCP的参数,连接超时等
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setSocketConnectTO(0); // 初始化连接池
pool.initialize(); // 压缩设置,超过指定大小(单位为K)的数据都会被压缩
mcc.setCompressEnable(true);
mcc.setCompressThreshold(64 * 1024);
} /**
* 保护型构造方法,不允许实例化!
*/
protected MemCached() { } /**
* 获取唯一实例.
*/
public static MemCached getInstance() {
return memCached;
} /**
* 添加一个指定的值到缓存中.
*/
public boolean add(String key, Object value) {
return mcc.add(key, value);
} /**
* 添加一个指定的值到缓存中并指定过期时间
*/
public boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
} /**
* 替换指定的值
*/
public boolean replace(String key, Object value) {
return mcc.replace(key, value);
} /**
* 替换指定的值并指定过期时间
*/
public boolean replace(String key, Object value, Date expiry) {
return mcc.replace(key, value, expiry);
} /**
* 根据指定的关键字获取对象.
*/
public Object get(String key) {
return mcc.get(key);
}
}

测试:

 package com.jt.memcached.demo;

 import java.util.Date;
import org.junit.Test;
import com.jt.memcached.mem.MemCached;
import com.jt.memcached.mem.User; public class MemcachedDemo { MemCached cache = MemCached.getInstance(); @Test
public void cachedData() { cache.add("hello", 234);
System.out.println("cached success!");
} @Test
public void getData() {
System.out.print("get value : " + cache.get("hello"));
} @Test
public void cachedUser() { User user = new User("jtKevin", 23, new Date());
cache.add("user", user);
System.out.println("cached a user success!");
} @Test
public void getUser() {
User cachedUser = (User) cache.get("user");
System.out.println("cached user:" + cachedUser);
}
//cached user:User [name=jtKevin, age=23, hiredDate=Mon Aug 17 12:36:29 CST 2015]
}

User类:

 package com.jt.memcached.mem;

 import java.io.Serializable;
import java.util.Date; public class User implements Serializable { private static final long serialVersionUID = 1L; private String name;
private int age;
private Date hiredDate; public User() {
super();
} public User(String name, int age, Date hiredDate) {
super();
this.name = name;
this.age = age;
this.hiredDate = hiredDate;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Date getHiredDate() {
return hiredDate;
} public void setHiredDate(Date hiredDate) {
this.hiredDate = hiredDate;
} public static long getSerialversionuid() {
return serialVersionUID;
} @Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", hiredDate=" + hiredDate + "]";
}
}

注意:

1 memcached是在服务器端的内存中缓存对象的,不是缓存或硬盘;

2 memcached的pool可以关联多个server,

String[] servers = {"10.20.185.12:11001","10.20.185.25:11001"};  
Integer[] weights = {3,7};

该配置表示30%的缓存在放在第一台服务器,70%的将放在第二台服务器,这样便可以充分利用不同服务器的内存了;

3我最困惑的是client是如何得到相应的pool的,后然看了点源码才知道是这样的。client是通过pool的name关联到某个pool的,

上面的例子中在SockIOPool pool = SockIOPool.getInstance();  和MemCachedClient client=new MemCachedClient();虽然都没写poolName,

但就是新建了一个”default“的pool,然后client关联到了这个”default“的pool。当然我们在新建这两个对象时可以给定具体的poolName。

三 Memcached的命令参数说明

memcached 1.4.2

-p       监听的TCP端口(默认: 11211)

-U       监听的UDP端口(默认: 11211, 0表示不监听)

-s      用于监听的UNIX套接字路径(禁用网络支持)

-a      UNIX套接字访问掩码,八进制数字(默认:0700)

-l      监听的IP地址。(默认:INADDR_ANY,所有地址)

-d            作为守护进程来运行。

-r            最大核心文件限制。

-u       设定进程所属用户。(只有root用户可以使用这个参数)

-m       单个数据项的最大可用内存,以MB为单位。(默认:64MB)

-M       内存用光时报错。(不会删除数据)

-c       最大并发连接数。(默认:1024)

-k            锁定所有内存页。注意你可以锁定的内存上限。

试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。

(不是前面的 -u  参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)

-v            提示信息(在事件循环中打印错误/警告信息。)

-vv           详细信息(还打印客户端命令/响应)

-vvv          超详细信息(还打印内部状态的变化)

-h            打印这个帮助信息并退出。

-i            打印memcached和libevent的许可。

-P      保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。

-f      块大小增长因子。(默认:1.25)

-n     分配给key+value+flags的最小空间(默认:48)

-L            尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。

为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。

-D      使用  作为前缀和ID的分隔符。

这个用于按前缀获得状态报告。默认是":"(冒号)。

如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。

-t       使用的线程数(默认:4)

-R            每个连接可处理的最大请求数。

-C            禁用CAS。

-b            设置后台日志队列的长度(默认:1024)

-B            绑定协议 - 可能值:ascii,binary,auto(默认)

-I            重写每个数据页尺寸。调整数据项最大尺寸。

四 Memcached常用命令及使用说明

存储命令

存储命令的格式:

<command name> <key> <flags> <exptime> <bytes>

<data block>

参数说明如下:

<command name>

set/add/replace

<key>

查找关键字

<flags>

客户机使用它存储关于键值对的额外信息

<exptime>

该数据的存活时间,0表示永远

<bytes>

存储字节数

<data block>

存储的数据块(可直接理解为key-value结构中的value)

1、添加

(1)、无论如何都存储的set

这个set的命令在memcached中的使用频率极高。

set命令不但可以简单添加,如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用

可以通过“get 键名”的方式查看添加进去的记录:

我们也可以通过delete命令删除掉,然后重新添加。

(2)、只有数据不存在时进行添加的add

(3)、只有数据存在时进行替换的replace

2、删除

可以看到,删除已存在的键值和不存在的记录可以返回不同的结果。

读取命令

1、get

get命令的key可以表示一个或者多个键,键之间以空格隔开

2、gets

可以看到,gets命令比普通的get命令多返回了一个数字(上图中为13)。

这个数字可以检查数据是否发生改变。当key对应的数据改变时,这个多返回的数字也会改变。

状态命令

查看 memcached 的内部状态

memcached 有个名为 stats 的命令,使用它可以获得各种各样的信息。 执行命令的方法很多,用

telnet 最为简单:

$ telnet  主机名 端口号

连接到 memcached 之后, 输入 stats 再按回车, 即可获得包括资源利用率在内的各种信息。 此外,

输入"stats slabs"或"stats items"还可以获得关于缓存记录的信息。结束程序请输入 quit。

 telnet 127.0.0.1 11211

 stats

 STAT pid 18006

 STAT uptime 702   //memcached运行的秒数

 STAT time 1292904537 //memcached服务器所在主机当前系统的时间,单位是秒。

 STAT version 1.4.5

 STAT pointer_size 64  //服务器所在主机操作系统的指针大小,一般为32或64

 STAT rusage_user 0.003999

 STAT rusage_system 0.013997

 STAT curr_connections 10   //表示当前的连接数

 STAT total_connections 11   //表示从memcached服务启动到当前时间,系统打开过的连接的总数。

 STAT connection_structures 11

 STAT cmd_get 0   //查询缓存的次数,平均每秒缓存次数cmd_get/uptime

 STAT cmd_set 0   //设置key=>value的次数

 STAT cmd_flush 0

 STAT get_hits 0  //缓存命中的次数,缓存命中率=get_hits/cmd_get*100%

 STAT get_misses 0  //cmd_get-get_hits

 STAT delete_misses 0

 STAT delete_hits 0

 STAT incr_misses 0

 STAT incr_hits 0

 STAT decr_misses 0

 STAT decr_hits 0

 STAT cas_misses 0

 STAT cas_hits 0

 STAT cas_badval 0

 STAT auth_cmds 0

 STAT auth_errors 0

 STAT bytes_read 7  //memcached服务器从网络读取的总的字节数

 STAT bytes_written 0  //memcached服务器发送到网络的总的字节数。

 STAT limit_maxbytes 67108864  //memcached服务缓存允许使用的最大字节数

 STAT accepting_conns 1

 STAT listen_disabled_num 0

 STAT threads 4

 STAT conn_yields 0

 STAT bytes 0

 STAT curr_items 0

 STAT total_items 0

 STAT evictions 0

 STAT reclaimed 0

 END

 Quit

memcached 学习笔记 1的更多相关文章

  1. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  2. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  3. Memcached 学习笔记(二)——ruby调用

    Memcached 学习笔记(二)——ruby调用 上一节我们讲述了怎样安装memcached及memcached常用命令.这一节我们将通过ruby来调用memcached相关操作. 第一步,安装ru ...

  4. Memcached学习笔记

    [TOC] 前言 此为学习笔记汇总,如有纰漏之处,还望不吝指出,谢谢. 启动流程 调用settings_init()设定初始化参数 从启动命令中读取参数来设置setting值 设定LIMIT参数 开始 ...

  5. memcached学习笔记2--安装及命令

    学习memcached的原理: 用户一 -> 访问浏览器 -> 服务器Apache -> PHP文件(该文件应用了memcached技术) -> [第一次]到数据库DB中查找数 ...

  6. memcached学习笔记6--浅谈memcached的机制 以及 memcached细节讨论

    附:请浅谈memcached的机制 答: ①基于C/S架构,协议比较简单 c/s架构,此时memcached为服务器端,我们可以使用如PHP,c++/c等程序连接memcached服务器. memca ...

  7. memcached学习笔记5--socke操作memcached 缓存系统

    使用条件:当我们没有权限或者不能使用服务器的时候,我们需要用socket操作memcached memcached-client操作 特点: 无需开启memcache扩展 使用fsocketopen( ...

  8. memcached学习笔记4--memcache扩展操作memcached

    1. 安装并配置memcache扩展库 找到php.ini文件 添加: extendsion= php_memcache.dll 并把对应的dll文件拷贝到ext目录 2. 使用PHP对Memcahc ...

  9. memcached学习笔记3--telnet操作memcached

    方式: 一.telnet访问memcached缓存系统(主要用于教学,不讨论) telnet 127.0.0.1 11211     => telnet IP地址 端口号 //往Memcache ...

  10. memcached学习笔记1--概念

    1.memcached是danga的一个项目,最早是LiveJournal服务的,最初为了加速LiveJournal访问速度而开发,后来被很多大型网站采用 官网: http://www.danga.c ...

随机推荐

  1. 基于Struts2开发学生信息管理系统 源码

    开发环境:    Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: 联系博主-Q:782827013

  2. [LeetCode 题解]: Partition List

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  3. tomcat7-maven-plugin 端口

    不知道有没有人像我这样,在pom配置了下面这段之后, <plugins> <plugin> <groupId>org.apache.tomcat.maven< ...

  4. MYC编译器源码分析之程序入口

    前文.NET框架源码解读之MYC编译器讲了MyC编译器的架构,整个编译器是用C#语言写的,上图列出了MyC编译器编译一个C源文件的过程,编译主路径如下: 首先是入口Main函数用来解析命令行参数,读取 ...

  5. .Net上传图片压缩质量,不改变尺寸

    图片上传有很多情况需要考虑,例如:生成缩略图.压缩尺寸.压缩质量.压缩尺寸质量.添加水印等等常见情况.最近遇到图片质量压缩不改变大小的问题,参考:听浪 #region 图片压缩 /// <sum ...

  6. c#去除DataTable空列

    网上搜了好多,没找到能用的,自己写一个,有发现错误的给我留言. private void RemoveNULLColumns(ref DataTable data)//删除空列 { try { Dat ...

  7. WP8.1StoreApp(WP8.1RT)---添加推送功能和获取系统信息

    添加推送通知 1:Package.appxmanifest中的声明添加后台任务的推送通知权限 2:var channel = await PushNotificationChannelManager. ...

  8. Javascript中的名词

    BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM (Document Object Model ...

  9. php实现socket简单的例子

    一.Socket简介 1.socket只不过是一种数据结构 2.使用这个socket数据结构去开始一个客户端和服务器之间的会话 3.服务器是一直在监听准备产生一个新的会话.当一个客户端连接服务端,它就 ...

  10. robot framework学习笔记之一 资源文件(Resource)和外部资源(External Resources)

    一.资源文件(Resource) 测试套件主要是存放测试案例,资源文件主要是用来存放用户关键字. 添加资源    在目录型的Project/Test Suite下单击鼠标右键,选择『New Resou ...