Linux Memcache 安装与配置指南:从入门到最佳实践
Memcache 是一款分布式内存对象缓存系统,旨在通过将频繁访问的数据存储在内存中,大幅降低数据库或后端服务的负载,提升应用响应速度。它以简单协议、极致性能和高扩展性著称,广泛应用于 web 应用(如 PHP、Python 服务)、API 缓存、会话存储等场景。
本文将从安装准备、分步安装、核心配置、客户端测试到最佳实践,为你提供一份全面的 Memcache 部署手册。无论你是 Linux 新手还是资深运维,都能快速掌握 Memcache 的生产级配置技巧。
目录#
- 什么是 Memcache?
- 安装前的准备
- 在 Linux 上安装 Memcache
- 3.1 基于包管理器安装(Ubuntu/Debian/CentOS/RHEL)
- 3.2 从源码编译安装(进阶)
- Memcache 核心配置详解
- 4.1 主配置文件说明
- 4.2 关键配置参数解析
- 启动与管理 Memcache 服务
- 5.1 系统服务管理(systemd)
- 5.2 手动启动与调试
- Memcache 客户端连接与测试
- 6.1 命令行工具(telnet/libmemcached)
- 6.2 编程语言客户端示例(PHP/Python)
- Memcache 最佳实践
- 7.1 内存分配与优化
- 7.2 性能调优
- 7.3 高可用性与扩展
- 7.4 安全配置
- 常见问题排查
- 总结
- 参考资料
1. 什么是 Memcache?#
Memcache(全称 Memcached,因 daemon 名称而常被混淆)是一个键值对(Key-Value)内存缓存系统,核心特点如下:
- 内存存储:数据完全存于内存,读写延迟低至微秒级(比磁盘快 100-1000 倍)。
- 简单协议:基于文本的 TCP 协议,支持
set/get/delete等基础操作,易于实现客户端。 - 分布式设计:客户端通过一致性哈希实现多服务器分片,无中心化节点。
- 轻量高效:单个实例仅占用数 MB 内存,支持万级并发连接。
典型使用场景#
- 缓存数据库查询结果(如用户信息、商品列表);
- 存储 API 响应(如第三方接口数据);
- 保存用户会话(如 PHP Session);
- 加速静态资源(如图片 URL、配置文件)。
2. 安装前的准备#
在安装前,需确认以下事项:
2.1 系统环境检查#
- 查看 Linux 发行版:
# Ubuntu/Debian lsb_release -a # CentOS/RHEL cat /etc/os-release - 确保网络连通(用于下载包):
ping -c 3 mirrors.aliyun.com
2.2 资源规划#
- 内存:Memcache 完全依赖内存,建议为其分配系统可用内存的 50%-70%(预留 30% 给 OS 和其他服务)。
- 端口:默认使用 11211,需确保未被占用:
netstat -tuln | grep 11211
2.3 权限#
需使用 sudo 或 root 用户执行安装命令。
3. 在 Linux 上安装 Memcache#
Memcache 的安装方式分为包管理器安装(推荐)和源码编译(进阶)。
3.1 基于包管理器安装(Ubuntu/Debian/CentOS/RHEL)#
3.1.1 Ubuntu/Debian 系列#
- 更新包列表:
sudo apt update - 安装 Memcache 及工具:
sudo apt install memcached libmemcached-toolsmemcached:核心服务;libmemcached-tools:命令行工具(如memcstat、memcdump)。
3.1.2 CentOS/RHEL 系列#
- 启用 EPEL 源(Memcache 不在默认源中):
sudo yum install epel-release -y - 安装 Memcache:
sudo yum install memcached libmemcached-tools -y
3.2 从源码编译安装(进阶)#
若需最新版本或自定义编译选项(如指定安装路径),可选择源码编译:
3.2.1 安装依赖#
# Ubuntu/Debian
sudo apt install gcc make libevent-dev -y
# CentOS/RHEL
sudo yum install gcc make libevent-devel -y3.2.2 下载并编译#
- 下载最新源码包(从 memcached.org 获取):
wget https://memcached.org/latest -O memcached.tar.gz - 解压并进入目录:
tar -zxvf memcached.tar.gz cd memcached-* - 配置编译选项:
./configure --prefix=/usr/local/memcached # 指定安装路径 - 编译并安装:
make && sudo make install - 验证安装:
/usr/local/memcached/bin/memcached -h # 查看帮助
4. Memcache 核心配置详解#
Memcache 的配置文件位置因发行版而异:
- Ubuntu/Debian:
/etc/memcached.conf - CentOS/RHEL:
/etc/sysconfig/memcached
4.1 主配置文件说明#
以 Ubuntu 的 memcached.conf 为例,默认配置如下:
# 以 daemon 模式运行
-d
# 监听地址(仅本地)
-l 127.0.0.1
# 监听端口
-p 11211
# 运行用户
-u memcache
# 最大内存(MB)
-m 64
# 最大并发连接数
-c 1024
# 线程数(匹配 CPU 核心)
-t 4
# PID 文件路径
-P /var/run/memcached.pid4.2 关键配置参数解析#
以下是生产环境中最常调整的参数:
| 参数 | 作用说明 | 最佳实践 |
|---|---|---|
-l | 监听地址(如 127.0.0.1 仅本地,0.0.0.0 所有地址) | 禁止公网暴露,优先用内网 IP(如 192.168.1.100)或 Unix 套接字。 |
-m | 最大内存(MB) | 分配系统可用内存的 50%-70%(如 8GB 内存设为 -m 5120)。 |
-c | 最大并发连接数 | 根据业务量调整(如高并发场景设为 -c 2048),需监控 curr_connections。 |
-t | 工作线程数 | 设为 CPU 核心数(如 4 核设为 -t 4),避免超线程。 |
-I | 最大 item 大小(默认 1MB) | 若存储大对象(如 5MB 图片 URL),需调整(如 -I 5M)。 |
-s | Unix 套接字路径(替代 TCP 连接) | 同机客户端优先用套接字(更快),需设权限(如 -a 0777 允许所有用户访问)。 |
-a | Unix 套接字权限 | 配合 -s 使用,如 -a 0770 仅允许 memcache 用户组访问。 |
示例:生产级配置(Ubuntu)#
修改 /etc/memcached.conf:
-d
-l 192.168.1.100 # 内网 IP
-p 11211
-u memcache
-m 5120 # 5GB 内存
-c 2048 # 最大 2048 连接
-t 8 # 8 核 CPU
-I 4M # 最大 item 4MB
-s /var/run/memcached.sock # Unix 套接字
-a 0770 # 套接字权限5. 启动与管理 Memcache 服务#
Memcache 通常以 systemd 服务运行,便于管理。
5.1 系统服务管理(systemd)#
5.1.1 基本命令#
| 操作 | 命令 |
|---|---|
| 启动服务 | sudo systemctl start memcached |
| 开机自启 | sudo systemctl enable memcached |
| 查看状态 | sudo systemctl status memcached |
| 重启服务 | sudo systemctl restart memcached |
| 停止服务 | sudo systemctl stop memcached |
5.1.2 验证运行状态#
# 查看监听端口
netstat -tuln | grep 11211
# 输出示例(TCP 监听)
tcp 0 0 192.168.1.100:11211 0.0.0.0:* LISTEN
# 输出示例(Unix 套接字)
unix 2 [ ACC ] STREAM LISTENING 12345 /var/run/memcached.sock5.2 手动启动与调试#
若需临时调试(非 daemon 模式),可手动启动:
# 手动启动(非 daemon,输出日志到终端)
/usr/bin/memcached -u memcache -l 127.0.0.1 -m 64 -c 1024- 调试完成后按
Ctrl+C停止。
6. Memcache 客户端连接与测试#
Memcache 支持多种客户端(命令行、编程语言),以下是常用方式。
6.1 命令行工具(telnet/libmemcached)#
6.1.1 使用 telnet 连接#
- 安装 telnet(若未安装):
sudo apt install telnet -y # Ubuntu sudo yum install telnet -y # CentOS - 连接 Memcache:
telnet 127.0.0.1 11211 - 执行基础操作:
- 存储数据:
set <key> <flags> <exptime> <bytes> <value>set user:1001 0 3600 8 # key=user:1001, flags=0, 过期 3600 秒, 值长度 8 {"name":"Alice"} # 输入值(需换行)flags:用户自定义元数据(如数据类型);exptime:过期时间(秒,0 为永久);bytes:值的字节长度。
- 获取数据:
get <key>get user:1001 VALUE user:1001 0 8 {"name":"Alice"} END - 删除数据:
delete <key>delete user:1001 - 查看状态:
statsstats STAT pid 1234 STAT uptime 3600 STAT bytes 1024 STAT curr_items 100 ... END - 清空缓存:
flush_all(谨慎使用!)
- 存储数据:
6.1.2 使用 libmemcached 工具#
libmemcached-tools 提供更友好的命令:
- 查看服务状态:
memcstat --servers=127.0.0.1:11211 - 列出所有键:
memcdump --servers=127.0.0.1:11211 - 获取键值:
memccat user:1001 --servers=127.0.0.1:11211
6.2 编程语言客户端示例#
6.2.1 PHP 客户端#
需安装 php-memcached 扩展:
# Ubuntu
sudo apt install php-memcached
# CentOS
sudo yum install php-pecl-memcached示例代码(memcache_test.php):
<?php
// 连接 Memcache
$mem = new Memcached();
$mem->addServer('127.0.0.1', 11211); // 或 Unix 套接字:$mem->addServer('/var/run/memcached.sock', 0);
// 存储数据
$mem->set('user:1001', ['name' => 'Alice', 'age' => 25], 3600);
// 获取数据
$user = $mem->get('user:1001');
print_r($user); // 输出:Array([name] => Alice [age] => 25)
// 删除数据
$mem->delete('user:1001');
?>运行测试:
php memcache_test.php6.2.2 Python 客户端#
使用 python-memcached 库:
pip install python-memcached示例代码(memcache_test.py):
import memcache
# 连接 Memcache
mc = memcache.Client(['127.0.0.1:11211']) # 或 Unix 套接字:['unix:/var/run/memcached.sock']
# 存储数据
mc.set('user:1001', {'name': 'Alice', 'age': 25}, time=3600)
# 获取数据
user = mc.get('user:1001')
print(user) # 输出:{'name': 'Alice', 'age': 25}
# 删除数据
mc.delete('user:1001')运行测试:
python memcache_test.py7. Memcache 最佳实践#
7.1 内存分配与优化#
- 监控内存使用:通过
stats命令查看bytes(已用内存)、limit_maxbytes(总内存)、evictions(缓存驱逐次数)。若evictions持续增长,需增大-m。 - 避免内存碎片化:使用
stats slabs查看 slab 状态,若fragmentation_ratio(碎片率)超过 20%,需调整-I(最大 item 大小)。
7.2 性能调优#
- 用 Unix 套接字代替 TCP:同机客户端优先用
-s参数,减少网络开销(延迟降低 30%+)。 - 启用 TCP_NODELAY:编辑配置文件,添加
-o tcp_nodelay(减少 TCP 延迟)。 - 避免大对象:Memcache 不适合存储超过 1MB 的对象(会增加内存碎片和 GC 压力),大对象建议用 Redis。
7.3 高可用性与扩展#
- 客户端分片:使用多台 Memcache 服务器,客户端通过一致性哈希分散键(如 PHP 的
Memcached::addServer添加多个节点):$mem->addServer('192.168.1.100', 11211); $mem->addServer('192.168.1.101', 11211); - 使用代理:用 Twemproxy 或 Memcached Proxy 实现服务发现和故障转移,降低客户端复杂度。
7.4 安全配置#
Memcache 无原生认证,需通过网络隔离保障安全:
- 限制监听地址:用
-l指定内网 IP 或127.0.0.1。 - 防火墙规则:
- Ubuntu(ufw):允许内网 IP 访问 11211 端口:
sudo ufw allow from 192.168.1.0/24 to any port 11211 - CentOS(firewalld):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="11211" protocol="tcp" accept' sudo firewall-cmd --reload
- Ubuntu(ufw):允许内网 IP 访问 11211 端口:
- 禁用不必要的命令:如
flush_all(清空缓存),可通过memcached -D:flush_all禁用。
8. 常见问题排查#
8.1 无法连接 Memcache#
- 检查服务状态:
systemctl status memcached; - 检查监听地址:
netstat -tuln | grep 11211; - 检查防火墙:
ufw status(Ubuntu)或firewall-cmd --list-all(CentOS)。
8.2 高内存占用#
- 查看缓存内容:
memcdump --servers=127.0.0.1:11211,检查大对象; - 调整
-m参数,或增大evictions(通过缩短过期时间)。
8.3 低缓存命中率#
- 计算命中率:
get_hits / (get_hits + get_misses)(通过stats命令); - 若命中率低于 80%,需优化缓存策略(如延长过期时间、调整缓存键粒度)。
9. 总结#
Memcache 是高并发场景下的缓存神器,其核心优势是简单、快速、轻量。通过本文的步骤,你已掌握:
- Memcache 的安装与基础配置;
- 客户端连接与测试;
- 生产级最佳实践(性能、安全、高可用);
- 常见问题排查。
在实际使用中,需结合业务场景调整配置,并持续监控(如 stats 命令、Prometheus exporter),确保 Memcache 始终高效运行。
10. 参考资料#
- Memcache 官方文档:https://memcached.org/docs/
- Ubuntu 官方指南:https://ubuntu.com/server/docs/databases-memcached
- CentOS 官方文档:https://docs.centos.org/en-US/centos/install-guide/Memcached/
- PHP Memcached 扩展:https://www.php.net/manual/en/book.memcached.php
- Python Memcache 库:https://pypi.org/project/python-memcached/
- Prometheus Memcached Exporter:https://github.com/prometheus/memcached_exporter
- Twemproxy 代理:https://github.com/twitter/twemproxy