Memcached介绍及简单的使用
1 Memcached介绍
1.1 概述
Memcached是一个开源的高性能的分布式内存对象缓存系统,在Web应用中用于减轻数据库负载。我们可以将使用频率较高,且要求时效性不严格的数据缓存到memcached中,以减少读取数据库的次数,从而减低数据库压力。另外,在集群环境下,也可以通过memcached缓存session,以达到session数据共享的目的。
1.2 特点
memcached作为高速运行的分布式缓存服务器,具有以下的特点。
· 协议简单
· 基于libevent的事件处理
· 内置内存存储方式
· memcached不互相通信的分布式
Memcached是否支持数据持久化?
没有,memcached不具备数据持久化功能,当memcached重启时,保存在里面的数据会全部丢失;
Memcached的各节点是否能够进行数据同步共享?
不能,memcached的各节点是相互独立的,无法共享数据;
Memcached是否会产生内存碎片?
不会,memcached使用SlabAllocation的内存预分配机制,不会产生内存碎片。
正是因为以上几点,memcached的CPU使用率是非常低的,所以如果服务器上有空闲的内存,不妨利用起来,作为缓存使用。
1.3 原理
1) 数据存储方式-Slab Allocation机制
名词解释:
Chunk:用于缓存记录的内存空间。
Page:分配给Slab的内存空间,默认是1MB。分配给Slab之后根据切分成大小相同的chunk。
Slab Class:特定大小的chunk的组。
Growth Factor:增长因数,默认为1.25
Memcached在启动时,会根据配置的起始chunk大小、增长因子Growth Factor、page的大小,生成Slab。例如chunk size是88B,page为1M,Growth Factor是1.25,则会生成88、112、144、184……1M等39组Slab。每个slab保存固定尺寸的chunk,由此不难发现,slab的chunk越大,其中的每个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
- 点赞
- 收藏
- 关注作者
评论(0)