Memcached 教程

Memcached 教程(中文版)

Memcached 是一个高性能的分布式内存对象缓存系统,常用于加速动态 Web 应用,减轻数据库负载。下面从 基础概念 → 安装 → 使用 → 高级特性 → 生产实践 一步步讲解。


1. 什么是 Memcached?

  • 全称:Distributed Memory Object Caching System
  • 作用:把热点数据放进内存,读写速度极快(微秒级)
  • 特点
  • 纯内存存储(掉电丢失)
  • Key-Value 存储(Key ≤ 250 B,Value ≤ 1 MB)
  • 支持多语言客户端
  • 无持久化、无复制、无认证(需配合防火墙)

2. 安装 Memcached

Linux(Ubuntu/Debian)

sudo apt update
sudo apt install memcached libmemcached-tools -y

Linux(CentOS/RHEL)

sudo yum install epel-release -y
sudo yum install memcached libmemcached -y

macOS(Homebrew)

brew install memcached libmemcached

启动服务

# 默认监听 11211 端口,内存 64MB
memcached -d -m 512 -p 11211 -u memcache -c 1024 -P /var/run/memcached.pid

# systemd 管理(Ubuntu 20.04+)
sudo systemctl start memcached
sudo systemctl enable memcached

3. 基本命令行操作(telnet)

telnet 127.0.0.1 11211

常用命令:

命令说明
set key flags exp size存储(exp=过期秒数,0=永不过期)
add key ...仅当 key 不存在时存储
replace key ...仅当 key 存在时替换
get key读取
delete key删除
flush_all清空所有缓存
stats查看统计信息
quit退出

示例

set user:1 0 900 9
zhangsan
STORED

get user:1
VALUE user:1 0 9
zhangsan
END

4. 客户端使用(以 Python 为例)

安装 Python 客户端

pip install pymemcache   # 推荐,纯 Python
# 或
pip install python-memcached

pymemcache 示例

from pymemcache.client.base import Client

# 连接(支持多节点)
client = Client(('127.0.0.1', 11211))

# 存储
client.set('user:1001', '李四', expire=3600)  # 1小时过期

# 读取
result = client.get('user:1001')
print(result)  # b'李四'

# 自增/自减
client.set('counter', 0)
client.incr('counter', 5)   # +5
client.decr('counter', 2)   # -2
print(client.get('counter'))  # b'3'

python-memcached 示例

import memcache

mc = memcache.Client(['127.0.0.1:11211'])
mc.set('key1', 'hello', time=60)
print(mc.get('key1'))

5. 其他语言客户端

语言客户端
PHPnew Memcached()
JavaSpymemcached / XMemcached
Node.jsmemjs / memcached
Gogithub.com/bradfitz/gomemcache
RubyDalli

6. 高级特性

6.1 多节点集群(一致性哈希)

client = Client([
    ('10.0.0.1', 11211),
    ('10.0.0.2', 11211),
    ('10.0.0.3', 11211)
])

自动按 Key 哈希分配节点,节点增减不影响大部分缓存。

6.2 序列化复杂对象

import json
user = {'id': 1, 'name': '王五', 'roles': ['admin']}
client.set('user:1', json.dumps(user))

6.3 缓存穿透防护(布隆过滤器)

# 伪代码
if bloom_filter.might_contain(key):
    value = cache.get(key)
    if not value:
        value = db.query(key)
        cache.set(key, value)
else:
    value = db.query(key)
    cache.set(key, value)

6.4 热点 Key 保护(本地缓存 + 分布式锁)

# 防止缓存雪崩
if not local_cache.get(key):
    lock = distributed_lock.acquire(key)
    if lock:
        try:
            value = db.query()
            cache.set(key, value, 300)
            local_cache.set(key, value, 10)
        finally:
            lock.release()

7. 生产环境最佳实践

项目建议
内存分配-m 设置为物理内存的 50~70%
连接数-c 4096(根据并发调整)
监听地址不要监听 0.0.0.0,改内网 IP
防火墙只允许 Web 服务器访问 11211
监控stats + Prometheus Exporter
过期策略热点数据 5~30 分钟,非热点 1~24 小时
避免大 Value>100KB 建议拆分或用 Redis
禁用 UDP加上 -U 0 防止反射攻击

8. 常见问题(FAQ)

问题解决方案
缓存丢失重启 Memcached 会清空,属正常
内存不足自动 LRU 淘汰旧数据
缓存雪崩设置随机过期时间 expire = 3600 + random(300)
缓存击穿热点 Key 加锁或本地缓存
无法连接检查防火墙、SELinux、-p 端口

9. 监控命令

echo "stats" | nc 127.0.0.1 11211

关键指标:

  • curr_items:当前条目数
  • total_items:历史总条目
  • get_hits / get_misses:命中率
  • evictions:淘汰数(>0 说明内存紧张)
  • bytes:已用内存

10. 简单 Web 缓存示例(Flask + Memcached)

from flask import Flask
from pymemcache.client.base import Client

app = Flask(__name__)
cache = Client(('127.0.0.1', 11211))

@app.route('/user/<uid>')
def get_user(uid):
    key = f'user:{uid}'
    user = cache.get(key)
    if not user:
        # 模拟数据库查询
        user = {'id': uid, 'name': f'User {uid}'}
        cache.set(key, user, 60)
    return user

小结

步骤内容
1安装 memcached
2启动服务(-m 512 -p 11211
3使用客户端 set/get
4多节点 + 序列化 + 防穿透
5监控 + 防火墙 + 合理过期

官方文档:http://memcached.org
GitHub:https://github.com/memcached/memcached

练习建议:

  1. 搭建本地 Memcached
  2. 用 Python 写一个缓存用户信息的 API
  3. 模拟 1000 次请求,观察 stats 变化

需要 Docker 部署与 Redis 对比图形化管理工具?继续问我!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部