CentOS 安装 memcached
首先查看米扑博客:Linux 安装配置 memcached
NoSQL是对 Not Only SQL、非传统关系型数据库的统称,诞生于1998年,2009年这个词被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。
随着互联网时代的到来,数据爆发式增长,数据库技术发展日新月异,要适应新的业务需求。而随着移动互联网、物联网的到来,大数据的技术中NoSQL也同样重要,例如:memcached、redis、mongodb、ElasticSearch等非关系数据库。
数据库排名:DB-Engines Ranking
Memcached is a high performance multithreaded event-based key/value cache store intended to be used in a distributed system.
Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.
Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统
Memcached 虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各Memcached服务器的数据进行同步,从而实现数据的一致性,即保证各Memcached的数据是一样的,即使有任何一台 Memcached 发生故障,只要集群中有一台 Memcached 可用就不会出现数据丢失,当其他Memcached 重新加入到集群的时候,可以自动从有数据的Memcached 当中自动获取数据并提供服务
Memcached 借助了操作系统的 libevent 工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。Memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能!
Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,Memcached 最适合保存用户的session实现session共享
Memcached存储数据时,Memcached会去申请1MB的内存,把该块内存称为一个slab, 也称为一个page
Memcached 内存工作机制
一般应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。但是,Memcached采用了Slab Allocator机制来分配、管理内存,非常高效。
Memcached内存分配从大到小:Page ——》 Chunk ——》Slab Class
Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk。
Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。
Chunk最大就是Page的大小,即一个Page中就一个Chunk
Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96B的Slab为Class1, Chunk 120B为Class 2, 如果有100bytes要存,那么Memcached会选择下图中Slab Class 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25
懒过期 Lazy Expiration
Memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,则把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。LRU (最近最少使用算法)
当内存不足时,Memcached会使用LRU(Least Recently Used)机制来淘汰和查找可用空间,分配给新记录使用Memcached集群功能
Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群。如果memcached想要使用集群,需要下载Repcached 来辅助实现集群。Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。Memcached 支持多种开发语言,包括:JAVA、C、Python、PHP、C#、Ruby、Perl等
memcached 官网:https://memcached.org
memcached 源码:https://github.com/memcached/memcached
一般情况下,CentOS已经默认安装了libevent的二进制库,但是没有安装相应的开发所用的头文件。
所以,你可以使用如下命令来安装:yum -y install libevent libevent-devel
推荐自定义安装最新版本的libevent,请查看米扑博客:Linux 安装配置 memcached
下载 memcached:https://memcached.org,或直接下载最新 memcached-1.5.9.tar.gz
解压安装:
tar -xzvf memcached-1.5.9.tar.gz
cd memcached-1.5.9
sh autogen.sh
./configure --prefix=/usr/local/memcached // 命令在指定路径里 /usr/local/memcached/bin/memcached
或执行libevent安装路径,例如:
./configure --with-libevent=/usr/ --prefix=/usr/local/memcached 推荐
make && make install
备注:如果 libevent 不是安装在 /usr/ 目录下,那么需要把 libevent-1.4a.so.1
启动
/usr/local/bin/memcached -l 127.0.0.1 -d -p 11211 -u nobody -m 64
或
memcached -u root -l 127.0.0.1 -p 11211 -m 64M -c 256 -P /var/log/memcached.pid -d 推荐
或
/usr/local/memcached/bin/memcached -d -u nobody -l 127.0.0.1 -p 11211 -m 64 -c 256 -t 4 -P /var/log/memcached.pid 强烈推荐
-d 表示用 daemon 方式的后台启动
-u 表示运行用户为 nobody
-l 表示监听服务器ip地址,可以有多个ip地址,例如在本机 127.0.0.1
-p 表示指定端口号,默认端口运行在11211
-P 表示设置保存Memcache的pid文件,例如 /var/log/memcached.pid
-m 表示分配的内存,单位是MB,例如分配64MB
-c 表示最大同时运行的并发连接数,默认是1024
-t 使用的线程数,默认为4
-Y 指定用户授权文件,格式为每行用户名:密码,例如:user:pass\nuser2:pass2\n
-f 增长因子--slab-growth-factor=<num>,默认num = 1.25
-v 详细信息,-vv能看到详细信息(包含客户端命令和返回值),-vvv是更详细信息
测试 key-value
可以使用telnet连接到192.168.10.60的11211端口
telnet 用法帮助:
# telnet help
usage: telnet [-l user] [-a] host-name [port]
telnet 退出命令:
quit
或
Ctrl + ] 进入 telnet 控制台,然后 quit
telnet 连接本机命令:
telnet 127.0.0.1 11211
连接成功以后,先向memcached中添加一个key-value对
# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set foo 0 0 3 bar STORED get foo VALUE foo 0 3 bar END quit Connection closed by foreign host.
如果能看到类似的输出,则证明memcached已经正确配置并启动成功了。
memcached set 命令
上面测试示例用到了命令:
set foo 0 0 3
此命令是什么意思呢?
set 命令的基本语法格式如下:
set key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值,例如:foo
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
以下实例中我们设置:
- key → foo
- flag → 0
- exptime → 0 (永远不过期)
- bytes → 3 (数据存储的字节数为3个字节)
- value → bar (超过3个字节则报错,例如mimvp)
示例:切记注意不要输入 " ^ + ]" 进telnet命令行,否则不生效
# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set foo 0 0 3 bar STORED get foo VALUE foo 0 3 bar END set foo 0 0 3 mimvp CLIENT_ERROR bad data chunk ERROR
memcached 常见操作命令
set # 重新设置 add # 新加一个数据 get # 调用 delete # 删除数据 flush_all # 删除全部数据 ## set/add/get三个命令用于操作存储在 memcached 中的键值对的标准修改命令,语法如下: command <key> <flags> <expiration time> <bytes> <value> # ## 使用示例 # set foo 0 0 5 mimvp # ## 参数说明如下: key # key 用于查找缓存值 flags # 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 expiration time # 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远保存,不会被LRU删除) bytes # 在缓存中存储的字节数,例如: "mimvp"为5个字节 value # 存储的值(始终位于第二行),例如: "mimvp" add key flags exptime bytes # 增加key,过期时间为秒,bytes为存储数据的字节数 # ## 显示服务状态 stats # 显示服务概览状态 stats items # 显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数) stats slabs # 用于显示各个slab的信息,包括chunk的大小、数目、使用情况等
开机启动 memcached (推荐方式3)
启动方式1:写入到 /etc/rc.d/rc.local (不推荐)
若希望开机启动memcached,可把上面命令写入到 /etc/rc.d/rc.local
## 开机启动命令写入(不推荐通过 rc.local 启动,推荐开机启动方式 systemctl start xx.service) # vim /etc/rc.d/rc.local memcached -u root -l 127.0.0.1 -p 11211 -m 64M -c 256 -P /var/log/memcached.pid -d # ## 修改使其生效 chmod +x /etc/rc.d/rc.local
启动方式2:/etc/init.d/memcached 启动脚本 (CentOS 5/6适用,CentOS 7/8不推荐)
vim /etc/init.d/memcached
#!/bin/sh ## ## memcached: MemCached Daemon # # chkconfig: - 90 25 # description: MemCached Daemon # author : www.mimvp.com # create : 2016.09.12 # update : 2014.06.28 # # CentOS 安装 memcached # https://blog.mimvp.com/article/4787.html # # 命令行启动 # /usr/local/memcached/bin/memcached -d -u nobody -l 127.0.0.1 -p 11211 -m 64 # /usr/local/memcached/bin/memcached -d -u nobody -l 127.0.0.1 -p 11211 -m 64 -c 1024 -t 4 -P /var/log/memcached.pid # # Source function library. MEMCACHED="/usr/local/memcached/bin/memcached" . /etc/rc.d/init.d/functions . /etc/sysconfig/network #[ ${NETWORKING} = "no" ] && exit 0 #[ -r /etc/sysconfig/dund ] || exit 0 #. /etc/sysconfig/dund #[ -z "$DUNDARGS" ] && exit 0 start() { echo -n $"Starting memcached: " daemon $MEMCACHED -d -u nobody -l 127.0.0.1 -p 11211 -m 64 -c 256 -t 4 -P /var/log/memcached.pid echo } stop() { echo -n $"Shutting down memcached: " killproc memcached echo } [ -f $MEMCACHED ] || exit 1 # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop sleep 3 start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit 0
添加可执行权限:
chmod +x /etc/init.d/memcached
增加开机自启动
# chmod 755 /etc/init.d/memcached
# chkconfig --add memcached
# chkconfig --level 345 memcached on
# chkconfig --list memcached
[root@mimvp-hz ~]# chkconfig --list memcached
memcached 0:off 1:off 2:on 3:on 4:on 5:on 6:off
启动方式3: systemctl start memcached.service (推荐)
1)注释掉 /etc/init.d/memcached 里的全部内容,防止其被 systemctl start memcached 使用
2)新建编辑 vim /usr/lib/systemd/system/memcached.service
3)添加如下内容:
[Unit] Description=memcached daemon #Before=httpd.service #Before=nginx.service After=network.target [Service] ## 手动启动命令, 详见米扑博客: https://blog.mimvp.com/article/4787.html #/usr/local/memcached/bin/memcached -d -u nobody -l 127.0.0.1 -p 11211 -m 64 -c 256 -t 4 -P /var/log/memcached.pid ExecStart=/usr/local/memcached/bin/memcached -u nobody -p 11211 -m 64 -c 256 -t 4 -P /var/log/memcached.pid ExecStop=/usr/bin/killall memcached [Install] WantedBy=multi-user.target
4)重新载入 systemd ,扫描新增或修改的 xx.service 生效
systemctl daemon-reload
# systemctl daemon-reload # 使修改生效 # systemctl restart memcached.service # 重启服务 # ps -ef | grep memcached # 查看memcached服务进程,与 memcached.service 配置是否一样 nobody 2557 1 0 20:16 ? 00:00:00 /usr/local/memcached/bin/memcached -u nobody -p 11211 -m 64 -c 256 -t 4 -P /var/log/memcached.pid
开机启动memcached,需执行:systemctl enable memcached.service
查看开机启动 systemctl 服务:systemctl list-unit-files | grep "enabled"
查看全部 systemctl 服务:systemctl list-unit-files
查看指定服务的是否开机启动:
systemctl list-unit-files | grep -iE "memcached|redis|mariadb|nginx|php|php-fpm"
# systemctl list-unit-files | grep -iE "memcached|redis|mariadb|nginx|php|php-fpm" mariadb.service enabled mariadb@.service disabled memcached.service enabled nginx.service enabled mariadb-extra.socket static mariadb-extra@.socket static mariadb.socket static mariadb@.socket static
5)systemctl 更多命令
systemctl enable memcached.service # 设置开机自启 systemctl disable memcached.service # 取消开机自启服务 systemctl start memcached.service # 开启Memcached systemctl stop memcached.service # 关闭Memcached systemctl restart memcached.service # 重启Memcached(相当于stop&start) systemctl reload memcached.service # 重载配置Memcached systemctl status memcached.service # 查看Memcached状态 ## 执行命令 lsof -i:端口号, 查看Memcached服务 # lsof -i:11211 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME memcached 2557 nobody 26u IPv4 34834 0t0 TCP *:memcache (LISTEN) memcached 2557 nobody 27u IPv6 34835 0t0 TCP *:memcache (LISTEN)
安装php-memcache扩展
git 源码:https://github.com/php-memcached-dev/php-memcached
官网下载:https://pecl.php.net/package/memcached
直接下载:http://pecl.php.net/get/memcache-2.2.4.tgz
# 解压安装 $ tar -zxvf memcache-2.2.4.tgz $ cd memcache-2.2.4 $ /usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache $ make $ make test $ mkdir /usr/local/php/extensions/ $ cp modules/memcache.so /usr/local/php/extensions/ # 在php.ini中加入扩展 [vi /usr/local/lib/php.ini] extension_dir = "/usr/local/php/extensions/" extension = "memcache.so"
重新启动apache即可
测试
下载: memcache.php
<?php $mc = new Memcache; $mc->connect("127.0.0.1",11211); $item = $mc->get('item'); if(!is_array($item)){ echo "Add item to memcache"; $mc->add('item',array('item')); } $item = $mc->get('item'); var_dump($item); ?>
参考推荐:
Linux php7安装mongoDB和memcached扩展
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2024-06-30 20:29:37
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!