Memcached介绍及简单的使用

举报
ikbob 发表于 2019/01/17 17:24:51 2019/01/17
【摘要】 1 Memcached介绍1.1 概述Memcached是一个开源的高性能的分布式内存对象缓存系统,在Web应用中用于减轻数据库负载。我们可以将使用频率较高,且要求时效性不严格的数据缓存到memcached中,以减少读取数据库的次数,从而减低数据库压力。另外,在集群环境下,也可以通过memcached缓存session,以达到session数据共享的目的。1.2 ...

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 3
123
STORED

set mykey 0 0 3
456
STORED


2).add 当数据不存在时存储。

add mykey 0 0 3
123
STORED
add mykey 0 0 3
456
NOT_STORED


3).replace 当数据存在时存储

set mykey 0 0 3
123
STORED

replace mykey 0 0 3
456
STORED

delete mykey
DELETED

replace mykey 0 0 3
678
NOT_STORED


读取命令


1).get key 可以一个或多个,用空格格开。

set mykey 0 0 3
123
STORED

set mykey1 0 0 3
456
STORED

get mykey mykey1
VALUE mykey 0 3
123
VALUE mykey1 0 3
456
END


2).gets 与 get 一样,但会返回多一个数字,这个数字用来检查数据是否被修改过,如修改过,这个数字回改变

set mykey 0 0 3
123
STORED

gets mykey
VALUE mykey 0 3 7
123
END

replace mykey 0 0 3
888
STORED

gets mykey
VALUE mykey 0 3 8
888
END


3).cas cas即checked and set ,当最后一个参数与gets返回的数字一致时才存储,否则返回EXISTS。

set mykey 0 0 3
123
STORED

gets mykey
VALUE mykey 0 3 9
123
END

cas mykey 0 0 3 8
456
EXISTS

cas mykey 0 0 3 9
456
STORED


追加与清除命令

1).append 将数据追加到当前缓存数据的之后,当缓存数据存在时才存储。

set mykey 0 0 3
123
STORED

append mykey 0 0 3
456
STORED

get mykey
VALUE mykey 0 6
123456
END

append notexists 0 0 3
456
NOT_STORED


2).prepend 将数据追加到当前缓存数据的之前,当缓存数据存在时才存储。

set mykey 0 0 3
123
STORED

prepend mykey 0 0 3
456
STORED

get mykey
VALUE mykey 0 6
456123
END

prepend notexists 0 0 3
456
NOT_STORED


3).delete 删除缓存数据,数据存在返回DELETED,数据不存在返回NOT_FOUND

set mykey 0 0 3
123
STORED

delete mykey
DELETED

delete mykey
NOT_FOUND

4).flush_all 将当前所有缓存数据设置为过期,但不会释放内存。

flush_all
OK


状态命令

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 0
ITEM 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






【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。