首先查看米扑博客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/lib 中(或者在/etc/ld.so.conf.d/目录下创建 memcached.conf,并输入memcached的lib路径,推荐此方式),否则memcached在配置的时候会报找不到libevent。

 

启动

/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 Memcached 安装

centos 下安装memcache配置

MemCached安装配置

Linux php7.0 安装redis和PHP扩展

Linux php7安装mongoDB和memcached扩展

Redis,MemCached,MongoDB概述

WordPress 启用Memcached内存缓存