Memcached介绍及简单的使用

网友投稿 824 2022-05-30

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(由于系统自带的版本旧,忽略依赖删除)

Memcached介绍及简单的使用

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

存储命令格式:

参数说明:

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

Memcached 缓存 存储

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为云数仓GaussDB(DWS)内存知识梳理
下一篇:Spring常见面试题(13个面试题,回答超详细)
相关文章