Memcached简介 #
一、什么是Memcached #
1.1 Memcached定义 #
Memcached是一个高性能的、分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
text
┌─────────────────────────────────────────┐
│ Memcached 架构 │
├─────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 客户端1 │ │ 客户端2 │ │ 客户端N │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └────────────┼────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Memcached Server │ │
│ │ (内存缓存) │ │
│ └─────────────────────┘ │
│ │ │
│ ┌────────────┴────────────┐ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 数据库 │ │ 应用服务 │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘
1.2 发展历史 #
| 时间 | 事件 |
|---|---|
| 2003年 | Brad Fitzpatrick为LiveJournal开发Memcached |
| 2004年 | Memcached开源发布 |
| 2009年 | Memcached被广泛采用 |
| 2011年 | Memcached 1.4.x版本稳定发布 |
| 2018年 | Memcached 1.5.x版本,性能大幅提升 |
| 2020年 | Memcached 1.6.x版本,支持更多特性 |
1.3 为什么选择Memcached #
text
传统数据库访问:
┌─────────────────────────────────────┐
│ 应用 → 网络 → 数据库 → 磁盘读取 │
│ 延迟:10-100ms │
└─────────────────────────────────────┘
使用Memcached缓存:
┌─────────────────────────────────────┐
│ 应用 → 网络 → Memcached → 内存读取 │
│ 延迟:0.1-1ms │
└─────────────────────────────────────┘
二、Memcached核心特点 #
2.1 高性能 #
text
Memcached性能指标:
读操作:100,000+次/秒
写操作:80,000+次/秒
原因:
1. 纯内存操作
2. 非阻塞IO
3. 多线程处理
4. 简单的协议
2.2 简单的协议 #
text
Memcached协议特点:
1. 基于文本的协议
- 易于调试
- 可通过telnet直接操作
2. 二进制协议(可选)
- 更高效
- 更安全
3. 支持UDP协议
- 适合读取操作
- 减少连接开销
2.3 分布式架构 #
text
Memcached分布式部署:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 节点1 │ │ 节点2 │ │ 节点3 │
│ 11211 │ │ 11212 │ │ 11213 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└────────────────┼────────────────┘
▼
┌──────────────┐
│ 客户端分片 │
│ 一致性哈希 │
└──────────────┘
2.4 内存管理 #
text
Slab Allocator内存管理:
┌─────────────────────────────────────┐
│ 内存池 │
├─────────────────────────────────────┤
│ Slab Class 1 (96 bytes) │
│ ├── Page ├── Page ├── Page │
│ ├── Chunk ├── Chunk ├── Chunk │
├─────────────────────────────────────┤
│ Slab Class 2 (120 bytes) │
│ ├── Page ├── Page ├── Page │
│ ├── Chunk ├── Chunk ├── Chunk │
├─────────────────────────────────────┤
│ Slab Class N (更大尺寸) │
└─────────────────────────────────────┘
2.5 LRU过期策略 #
text
LRU(Least Recently Used)算法:
┌─────────────────────────────────────┐
│ 内存满时自动淘汰最近最少使用的数据 │
│ │
│ 新数据 → 淘汰旧数据 → 空间释放 │
└─────────────────────────────────────┘
三、应用场景 #
3.1 数据库缓存 #
text
缓存架构:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 客户端 │────▶│Memcached │────▶│ 数据库 │
└──────────┘ └──────────┘ └──────────┘
│
▼
缓存命中直接返回
缓存未命中查数据库
并写入缓存
bash
# 缓存示例
set user:1001 0 3600 23
{"name":"John","age":25}
get user:1001
3.2 Session存储 #
text
分布式Session:
┌──────────┐ ┌──────────┐
│ 服务器A │ │ 服务器B │
└────┬─────┘ └────┬─────┘
│ │
└────────┬───────┘
▼
┌──────────┐
│Memcached │
│Session存储│
└──────────┘
3.3 页面缓存 #
bash
# 缓存整个页面
set page:home 0 300 1024
<html>...</html>
# 缓存页面片段
set fragment:header 0 600 256
<div class="header">...</div>
3.4 API响应缓存 #
bash
# 缓存API响应
set api:weather:beijing 0 1800 128
{"temp":25,"humidity":60}
# 缓存配置数据
set config:app 0 0 64
{"theme":"dark","lang":"zh"}
3.5 计数器 #
bash
# 页面访问计数
incr page:views:1001 1
# API调用计数
incr api:calls:weather 1
# 限流计数
incr rate:user:1001 1
四、Memcached与其他缓存对比 #
4.1 Memcached vs Redis #
| 特性 | Memcached | Redis |
|---|---|---|
| 数据类型 | 仅字符串 | 丰富(5种基础类型) |
| 持久化 | 不支持 | RDB/AOF |
| 集群 | 客户端分片 | 原生集群 |
| 线程模型 | 多线程 | 单线程 |
| 内存管理 | Slab Allocator | 更灵活 |
| 事务 | 不支持 | 支持 |
| 适用场景 | 简单缓存 | 复杂缓存+数据结构 |
4.2 Memcached vs 本地缓存 #
| 特性 | Memcached | 本地缓存 |
|---|---|---|
| 分布式 | 支持 | 不支持 |
| 数据一致性 | 较好 | 差 |
| 内存容量 | 可扩展 | 受限于单机 |
| 网络开销 | 有 | 无 |
| 适用场景 | 分布式系统 | 单机应用 |
五、Memcached适用场景总结 #
5.1 适合使用Memcached的场景 #
text
✓ 简单键值缓存
✓ 数据库查询缓存
✓ Session存储
✓ 页面缓存
✓ API响应缓存
✓ 计数器
✓ 分布式系统缓存
5.2 不适合使用Memcached的场景 #
text
✗ 需要复杂数据结构
✗ 需要数据持久化
✗ 需要事务支持
✗ 需要消息队列功能
✗ 数据量超过内存容量
六、Memcached工作原理 #
6.1 请求处理流程 #
text
客户端请求处理流程:
┌─────────────────────────────────────┐
│ 1. 客户端发送请求 │
│ ↓ │
│ 2. 连接线程接收请求 │
│ ↓ │
│ 3. 工作线程处理请求 │
│ ↓ │
│ 4. 查找内存中的数据 │
│ ↓ │
│ 5. 返回结果给客户端 │
└─────────────────────────────────────┘
6.2 数据存储结构 #
text
Item存储结构:
┌─────────────────────────────────────┐
│ Item Header │
│ ├── key长度 │
│ ├── 数据长度 │
│ ├── flags │
│ ├── 过期时间 │
│ ├── CAS ID │
│ ├── 下一个Item指针 │
│ └── 前一个Item指针 │
├─────────────────────────────────────┤
│ Key Data │
├─────────────────────────────────────┤
│ Value Data │
└─────────────────────────────────────┘
七、Memcached限制 #
7.1 数据大小限制 #
text
单个Item限制:
默认最大:1MB
可配置最大:128MB(需要重新编译)
建议:
- 单个Item不超过1MB
- 大数据考虑分片存储
7.2 键长度限制 #
text
键长度限制:
最大长度:250字节
建议:
- 使用有意义的键名
- 避免过长的键名
- 使用命名空间前缀
7.3 内存限制 #
text
内存限制:
32位系统:最大2GB
64位系统:几乎无限制
建议:
- 根据业务需求配置
- 预留一定内存余量
- 监控内存使用情况
八、总结 #
Memcached核心特点:
| 特点 | 说明 |
|---|---|
| 高性能 | 内存存储,QPS可达10万+ |
| 简单协议 | 文本协议,易于使用 |
| 分布式 | 客户端分片,可扩展 |
| 多线程 | 充分利用多核CPU |
| LRU淘汰 | 自动管理内存 |
下一步,让我们学习Memcached的安装与配置!
最后更新:2026-03-27