Memcached介绍及简单的使用

来源:互联网 发布:读英文软件 编辑:程序博客网 时间:2024/06/06 07:46

1       Memcached介绍

1.1     概述

Memcached是一个开源的高性能的分布式内存对象缓存系统,在Web应用中用于减轻数据库负载。我们可以将使用频率较高,且要求时效性不严格的数据缓存到memcached中,以减少读取数据库的次数,从而减低数据库压力。另外,在集群环境下,也可以通过memcached缓存session,以达到session数据共享的目的。

1.2     特点

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

· 协议简单

· 基于libevent的事件处理

· 内置内存存储方式

· memcached不互相通信的分布式

 

Memcached是否支持数据持久化?

没有,memcached不具备数据持久化功能,当memcached重启时,保存在里面的数据会全部丢失;

Memcached的各节点是否能够进行数据同步共享?

不能,memcached的各节点是相互独立的,无法共享数据;

Memcached是否会产生内存碎片?

不会,memcached使用SlabAllocation的内存预分配机制,不会产生内存碎片。

正是因为以上几点,memcachedCPU使用率是非常低的,所以如果服务器上有空闲的内存,不妨利用起来,作为缓存使用。

1.3     原理

1)     数据存储方式-Slab Allocation机制

名词解释:

Chunk:用于缓存记录的内存空间。

Page:分配给Slab的内存空间,默认是1MB。分配给Slab之后根据切分成大小相同的chunk

Slab Class:特定大小的chunk的组。

Growth Factor:增长因数,默认为1.25

 

Memcached在启动时,会根据配置的起始chunk大小、增长因子Growth Factorpage的大小,生成Slab。例如chunk size88Bpage1MGrowth Factor1.25,则会生成88112144184……1M39Slab。每个slab保存固定尺寸的chunk,由此不难发现,slabchunk越大,其中的每个page包含的chunk数量就越少。


1 Slab Allocation的构造图

 

当有新的对象放入memcached时,memcached会根据对象的大小匹配到对应的slab上,比如100KB的对象,根据最小空间损失原则,会被放入到slab2(size:112B)对应的page下,如下图


2选择存储记录的组的方法

综上,不难发现SlabAllocation存储方式的缺点:

A.   启动时直接生成了slabs,如果在实际应用中没有被使用,则会造成内存浪费

B.  由于分割成特定长度的chunck,因此保证有效的内存利用。例如,将100字节的数据缓存到128字节的chunk里,将会造成28字节的内存浪费

 

2       Memcached安装

2.1  准备工作

下载memcached与libevent的安装文件

http://memcached.googlecode.com/files/memcached-1.4.16.tar.gz(memcached下载地址)

https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz(libevent下载地址)

2.2  具体安装步骤

 

1)       由于memcached依赖于libevent,因此需要安装libevent。由于linux系统可能默认已经安装libevent,执行命令:

rpm -qa|grep libevent

查看系统是否带有该安装软件,如果有执行命令:

rpm -e libevent-1.4.13-4.el6.x86_64--nodeps(由于系统自带的版本旧,忽略依赖删除)

2)       安装libevent命令:

tar zxvf libevent-2.0.21-stable.tar.gz

     cdlibevent-2.0.21-stable

      ./configure--prefix=/usr/local/libevent

    make

    make install

至此libevent安装完毕;测试libevent是否安装成功:

3)       安装memcached命令:

tar zxvf memcached-1.4.2.tar.gz

cd memcached-memcached-1.4.2

  ./configure--prefix=/usr/local/memcached--with-libevent=/usr/local/libevent/

make

make install

至此memcached安装完毕;测试是否成功安装memcached:

[root@linux memcached]# ls -al /usr/local/bin/mem*

-rwxr-xr-x 1 root root 245919 12-10 19:03/usr/local/bin/memcached

4)       启动memcached

/usr/local/memcached/bin/memcached -d -m256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid

启动参数说明:

-d 选项是启动一个守护进程。

-u root 表示启动memcached的用户为root。

-m 是分配给Memcache使用的内存数量,单位是MB,默认64MB。

-M return error on memory exhausted(rather than removing items)。

-u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。

-l 是监听的服务器IP地址,默认为所有网卡。

-p 是设置Memcache的TCP监听的端口,最好是1024以上的端口。

-c 选项是最大运行的并发连接数,默认是1024。

-P 是设置保存Memcache的pid文件。

-f <factor> chunk size growthfactor (default: 1.25)。

-I Override the size ofeach slab page. Adjusts max item size(1.4.2版本新增)。  也可以启动多个守护进程,但是端口不能重复

 

查看进程

[root@linuxmemcached]# ps aux | grep memcached

5)       停止memcached

找到进程号,直接kill掉

6)       可能存在的错误以及解决方案

如果出现客户端连接不上memcached的情况,请将防火墙关闭或将防火墙中的memcached端口(11211端口)打开。

 

开启对外访问的网络端口(以11211为例):

iptables -A INPUT-p tcp --dport 11211 -j ACCEPT

iptables -A OUTPUT-p tcp --sport 11211 -j ACCEPT #开启11211端口

service iptablessave #保存配置

/etc/rc.d/init.d/iptablesrestart #重启服务

 

查看端口是否开放

/etc/init.d/iptablesstatus 或/e

注意:make的时候报错

memcached.c: 在函数‘add_iov’中:memcached.c:696:30: 错误: ‘IOV_MAX’未声明(在此函数内第一次使用)memcached.c:696:30: 附注: 每个未声明的标识符在其出现的函数内只报告一次make[2]: *** [memcached-memcached.o] 错误 1

需要修改 memcached.c 文件:

/* FreeBSD 4.x doesn't have IOV_MAX exposed. */#ifndef IOV_MAX#if defined(__FreeBSD__) || defined(__APPLE__)# define IOV_MAX 1024#endif#endif改成:/* FreeBSD 4.x doesn't have IOV_MAX exposed. */#ifndef IOV_MAX# define IOV_MAX 1024#endif
再make&&make install,编译之后退出root用户。tc/init.d/iptables –Ln


3 Memcached使用

3.1  命令模式下

memcached 查看方法

格式: telnet ip port

例如 telnet localhost 11211

退出命令:quit


存储命令格式:

<command name> <key> <flag> <expire> <bytes>
<data block>
参数说明:

command name命令名称key查找关键字flag存储额外信息expire数据保存时间,0表示永远,单位秒bytes存储数据的字节数data block存储的数据

1).set  无论如何都存储,数据不存在时存储,数据存在时更新。
set mykey 0 0 3123STOREDset mykey 0 0 3456STORED

2).add 当数据不存在时存储。
add mykey 0 0 3123STOREDadd mykey 0 0 3456NOT_STORED

3).replace 当数据存在时存储
set mykey 0 0 3123STOREDreplace mykey 0 0 3456STOREDdelete mykeyDELETEDreplace mykey 0 0 3678NOT_STORED

读取命令

1).get key 可以一个或多个,用空格格开。
set mykey 0 0 3123STOREDset mykey1 0 0 3456STOREDget mykey mykey1VALUE mykey 0 3123VALUE mykey1 0 3456END

2).gets 与 get 一样,但会返回多一个数字,这个数字用来检查数据是否被修改过,如修改过,这个数字回改变
set mykey 0 0 3123STOREDgets mykeyVALUE mykey 0 3 7123ENDreplace mykey 0 0 3888STOREDgets mykeyVALUE mykey 0 3 8888END

3).cas cas即checked and set ,当最后一个参数与gets返回的数字一致时才存储,否则返回EXISTS。
set mykey 0 0 3123STOREDgets mykeyVALUE mykey 0 3 9123ENDcas mykey 0 0 3 8456EXISTScas mykey 0 0 3 9456STORED

追加与清除命令

1).append 将数据追加到当前缓存数据的之后,当缓存数据存在时才存储。
set mykey 0 0 3123STOREDappend mykey 0 0 3456STOREDget mykeyVALUE mykey 0 6123456ENDappend notexists 0 0 3456NOT_STORED

2).prepend 将数据追加到当前缓存数据的之前,当缓存数据存在时才存储。
set mykey 0 0 3123STOREDprepend mykey 0 0 3456STOREDget mykeyVALUE mykey 0 6456123ENDprepend notexists 0 0 3456NOT_STORED

3).delete 删除缓存数据,数据存在返回DELETED,数据不存在返回NOT_FOUND
set mykey 0 0 3123STOREDdelete mykeyDELETEDdelete mykeyNOT_FOUND
4).flush_all 将当前所有缓存数据设置为过期,但不会释放内存。
flush_allOK

状态命令

1).stats 查看memcached运行状态
pid                     Memcached 进程ID    uptime                  Memcached 运行时间,单位:秒    time                    Memcached 当前的UNIX时间    version                 Memcached 的版本号    rusage_user             该进程累计的用户时间,单位:秒    rusage_system           该进程累计的系统时间,单位:秒    curr_items              Memcached 当前存储的内容数量    total_items             Memcached 启动以来存储过的内容总数    bytes                   Memcached 当前存储内容所占用的字节数(*/1024/1024=mb)    curr_connections        当前连接数量    total_connections       Memcached 运行以来接受的连接总数    connection_structures   Memcached 分配的连接结构的数量    cmd_get                 查询请求总数    cmd_set                 存储(添加/更新)请求总数    get_hits                查询成功获取数据的总次数    get_misses              查询成功未获取到数据的总次数    bytes_read              Memcached 从网络读取到的总字节数    bytes_written           Memcached 向网络发送的总字节数    limit_maxbytes          Memcached 在存储时被允许使用的字节总数  

2).stats items
执行stats items,可以看到STAT items行,如果memcached存储内容很多,那么这里也会列出很多的STAT items行。
3).stats cachedump slabs_id limit_num
slabs_id:由stats items返回的结果(STAT items后面的数字)决定的
limit_num:返回的记录数,0表示返回所有记录
通过stats items、stats cachedump slab_id limit_num配合get命令可以遍历memcached的记录。

stats cachedump 1 0ITEM mykey [3 b; 1362880145 s]END

4).stats slabs 显示各个slab的信息,包括chunk的大小、数目、使用情况等


5).stats sizes
 输出所有item的大小和个数


6).stats reset
 清空统计数据

3.2  Java代码中

1.1. 3.2.1配置XMemcached客户端的jar包

  xmemcached-1.2.3.jar

    3.2.2 java代码段举例

MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.4.151:11211"));//通过连接地址及端口获取builder对象MemcachedClient memcachedClient = null;try {     memcachedClient = builder.build();     memcachedClient.set("key", 0, “value”);// 设置键为key的内容,0代表生存周期为无限     Object obj = memcachedClient.get("key");//获取键为key的内容     memcachedClient.delete("key");//删除键为key的内容} catch (MemcachedException e) {   System.err.println("MemcachedClient operation fail");   e.printStackTrace();} catch (TimeoutException e) {   System.err.println("MemcachedClient operation timeout");   e.printStackTrace();} catch (InterruptedException e) {   e.printStackTrace();} catch (IOException e) {   e.printStackTrace();}try {    memcachedClient.shutdown();} catch (IOException e) {    System.err.println("Shutdown MemcachedClient fail");    e.printStackTrace();}
附:

以上内容相关的安装包及jar如下:
http://download.csdn.net/detail/keyingbo2008/6943287

 xme





0 0
原创粉丝点击