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