缓存学习(三):MemCached安装、配置和命令

目录

1.安装

2.使用

2.1 常用选项

2.2 命令格式

2.3 命令


EhCache和Guava Cache虽然简单、高效,但是它们都是本地缓存(EhCache可以分布式部署,但是需要依赖Terracotta,显然不利于维护),一般只是用在单个应用程序实例内部。在实际的分布式系统中,缓存更多地用于缓存数据库的热点数据,以减轻数据库负担,常用的分布式缓存有Redis和Memcached。MemCached是一个开源、高性能的分布式内存对象缓存系统,在许多互联网公司都有应用。

1.安装

Memcached可以运行在Linux和Windows平台上,这里以Linux为例。首先需要去官网下载安装包(目前最新的是1.5.12版本):

wget https://memcached.org/latest

然后解压:

tar -zxvf memcached-1.5.12.tar.gz

此时还不能进行安装,需要先安装依赖组件libevent-dev:

sudo apt-get install libevent-dev

然后进入解压后的目录,执行configure文件,这里按照官方示例,只配置了prefix属性,即安装目录:

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

在memcached安装包解压后的目录下运行以下命令可以查看configure文件的所有可配置项:

./configure --help

然后使用make进行编译和安装:

make && sudo make install

由于Memcached没有自动加环境变量,这里我们在~/.bashrc中配置一下别名:

sudo vim ~/.bashrc

在文件中输入 alias memcached="/usr/local/memcached/bin/memcached"并保存退出。最后刷新一下配置:

source ~/.bashrc

现在可以使用 memcached -h 命令验证是否安装成功,如果能够成功输出帮助信息,说明安装已经成功。

2.使用

2.1 常用选项

首先来看一下memcached提供的一些常用选项。

  • -p port 或 --port=<port>:指定监听的TCP端口,默认11211(粗斜体代表可替换内容,下同)
  • -U port 或 --udp-port=<port>:指定监听的UDP端口,默认为0,即不开启
  • -l host 或 --listen=<host>:指定监听的主机IP地址,如果是本机可以不写
  • -u user 或 --user=<user>:设置运行Memcached实例的用户
  • -m limit 或 --memory-limit=<limit>:设置存储数据用的内存容量(不包括Memcached本身占用的),单位MB
  • -c num 或 --conn-limit=<num>:设置最大连接数,默认1024
  • -M 或 --disable-evictions:禁用自动缓存清除(LRU策略),在内存不足时报错
  • -P file 或 --pidfile=<file>:将进程PID保存到文件中,必须配合-d选项(开启后台模式)使用
  • -t num 或 --threads=<num>:设置Memcached线程数,和Redis不同,Memcached支持多线程,默认为4,建议设置为和本机CPU数量一致
  • -L 或 --enable-largepages:启用大内存页,可以提高性能
  • -f num 或 --slab-growth-factor=<num>:增长因子,默认1.25
  • -R 或 --max-reqs-per-event:单个事件的最大连接数,默认20
  • -C 或 --disable-cas:禁用CAS命令,可以减少开销

除此之外还有很多命令,此外,-o 或 --extended 选项还有很多扩展选项,不做详细介绍了。

下面是一个启动Memcached实例的命令:

memcached -d -m 512 -u root -P /usr/local/memcached/memcached.pid

启动之后可以通过 ps -el 看到memcached进程在运行。和Redis不同,Memcached没有提供客户端程序,而是需要使用telnet进行连接:

ubuntu@VM-0-6-ubuntu:~$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

2.2 命令格式

Memcached命令的基本格式如下:

command key flags exptime bytes value

含义为:

  • command:操作命令,有set、add、get、delete等
  • key:缓存数据的键,最大长度250个字符
  • flags:用于标识数据序列化格式
  • exptime:缓存数据的存活时间,单位为秒,0代表不过期
  • bytes:缓存数据的大小,单位为字节
  • value:缓存数据的值

2.3 命令

1) set

set命令用来将数据值存储到指定的key中,如果key已存在,则进行更新。设置成功后,会返回STORED。该命令有一个额外的可选选项:noreply,表示不需要服务器返回数据。下面是测试的例子(为了方便阅读,在每组命令之间多打了一个空行,实际是没有的):

set userid 0 0 5
00001
STORED

get userid
VALUE userid 0 5
00001
END

set userid 0 0 5 noreply
00002

get userid
VALUE userid 0 5
00002
END

如果保存失败,会输出ERROR

2) get

get命令可以获取单个或多个key关联的值,上面的例子中演示了单个key的获取,多个key的格式如下:

get key1 key2 ...

3) add

add类似于set,只是如果要设置的key已经存在,则不会更新值,拿Java中的Map来比较,set就是put方法,add就是putIfAbsent方法。命令格式和set也一样。

4) replace

replace仅用于更新值,如果要更新的key不存在,则返回NOT_STORED,否则返回STORED

5)append、prepend

 append用于向已存在的数据后面追加值,prepend则相反,用于在数据前面追加值:

add userid 0 0 5
00001
STORED
append userid 0 0 5
00002
STORED
get userid
VALUE userid 0 10
0000100002
END

append或pretend时,bytes字段只需要计算追加部分的长度即可,不需要计算总长度

6)delete

delete命令用于删除指定的缓存数据,数据不存在则返回NOT_FOUND,删除成功返回DELETED,失败返回ERROR

7)incr/decr

incr/decr命令可以对数字值进行修改,令其增大或减少指定数量,命令格式如下:

incr key increment
decr key decrement

示例:

add usercount 0 0 1
1
STORED
incr usercount 100
101
get usercount 
VALUE usercount 0 3
101
END

可以看到,如果增加/减少成功,会返回新的数值,并且会自动增大缓存数据的长度,如果key不存在,则返回NOT_FOUND,如果key对应的value不是数值,则返回CLIENT_ERROR,其他错误返回ERROR。

8)CAS操作:cas、gets

CAS是并发领域的常见概念,其原理不需要多介绍。Memcached的cas命令就是在没有其他客户端写入的情况下才进行值的写入,命令格式如下:

cas key flags exptime bytes version
value

这里的versiob需要使用gets命令来获取,gets和get命令使用基本一致,只是返回内容多了一列,即version。完整示例如下:

gets usercount
VALUE usercount 0 3 16
201
END
cas usercount 0 0 3 16
300
STORED
get usercount
VALUE usercount 0 3
300
END

9)统计

统计命令有四个:stats(输出服务器信息)、stats items(输出各slabs中缓存元素的数目及最后一次访问后过去的时间)、stats slabs(显示slab的信息,如chunk大小、数目、占用及空闲情况、命中情况等)、stats sizes(显示所有item的大小和个数)

10)清理

Memcached提供了flush_all命令,可以清除所有缓存数据,还允许延时操作,其命令格式如下:

flush_all [time] [noreply]

time表示多少时间后再执行清除操作,是一个数字,单位为秒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章