Memcached 教程(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

什么是 Memcached?

Memcached 是一个高性能的分布式内存对象缓存系统,最初由 Danga Interactive 公司为了解决高并发场景下的数据库压力而开发。它通过将数据缓存在内存中,减少对数据库的直接访问,从而提升应用的响应速度和吞吐量。

Memcached 的核心功能可以用一个 “临时记忆” 的比喻来理解:假设你的大脑需要频繁回忆某个复杂信息,但每次都要从书本中查找会很慢。Memcached 就像大脑的临时记忆区,将常用信息直接存放在容易访问的地方,需要时快速调用,避免重复计算或查询。

为什么选择 Memcached?

Memcached 的优势体现在以下几个方面:

  1. 高性能:基于内存存储,读写速度可达 10万次/秒以上
  2. 分布式架构:支持多节点扩展,适用于大规模系统。
  3. 轻量级:仅需极少的资源即可运行,兼容多种编程语言。
  4. 简单易用:API 接口简洁,学习成本低。

对于初学者来说,Memcached 是学习缓存技术的绝佳起点,因为它能直观地展示如何通过缓存优化应用性能。


Memcached 的核心概念与工作原理

1. 缓存的基本概念

缓存的目的是 “先存后取,减少重复劳动”。例如,当用户请求某个热门文章的详细信息时,数据库可能需要多次查询才能返回结果。通过 Memcached,首次查询后,数据会被缓存到内存中,后续请求直接从内存读取,避免重复查询数据库。

2. Memcached 的架构设计

Memcached 采用 Client-Server 架构

  • 客户端:应用通过 API 向 Memcached 发送命令(如 setget)。
  • 服务端:负责接收命令、存储数据,并通过 LRU(最近最少使用)算法 管理内存空间。

![架构图描述:客户端发送请求到 Memcached 服务端,服务端存储数据并返回结果。]
图示:Memcached 的基本交互流程(文字描述,因无图片链接需求)

3. 存储与检索机制

Memcached 的存储单元是 键值对(Key-Value),每个键对应一个值(可以是字符串、序列化对象等)。其核心操作包括:

  • set key value:将键值对存入缓存。
  • get key:从缓存中获取值。
  • delete key:删除指定键的值。

比喻:将键比作图书馆的书籍编号,值比作书籍内容。当读者(客户端)请求某本书时,图书馆员(Memcached)先检查编号是否在临时书架(内存)中,若存在则直接取出,否则去库房(数据库)查找。

4. 过期时间与淘汰策略

  • 过期时间(Expiry Time):通过 set key value exptime 设置键的生存时间,默认为永久有效。
  • 淘汰策略(Eviction Policy):当内存不足时,Memcached 会根据 LRU 算法删除 最近最少使用的数据,腾出空间存储新数据。

Memcached 的安装与配置

1. 安装步骤

Memcached 支持多种操作系统,以下以 Ubuntu 为例:

sudo apt-get install memcached  

sudo apt-get install telnet  

启动服务后,默认监听 11211 端口。可通过以下命令测试连接:

telnet localhost 11211  
set mykey 0 60 5  
hello  

2. 配置文件优化

Memcached 的配置文件通常为 /etc/memcached.conf,关键参数包括:
| 参数 | 说明 | 示例值 |
|------|------|--------|
| -m | 内存大小(MB) | -m 1024 |
| -l | 监听地址 | -l 127.0.0.1 |
| -p | 端口号 | -p 11211 |

修改后重启服务:

sudo systemctl restart memcached  

Memcached 的基础操作

1. 使用 Python 操作 Memcached

Python 通过 python-memcachedpylibmc 库与 Memcached 交互。以下是一个简单示例:

from memcache import Client  

clients = Client(['127.0.0.1:11211'])  

clients.set('user:1001:name', 'Alice', time=60)  # 60秒后过期  

user_name = clients.get('user:1001:name')  
print(user_name)  # 输出:Alice  

clients.delete('user:1001:name')  

2. 批量操作与 CAS

Memcached 支持批量操作(如 get_multi)和 CAS(Compare and Swap) 机制,用于解决并发修改冲突:

data = clients.get_multi(['key1', 'key2'])  

cas_token = clients.cas('counter', 0, cas=True)  
clients.cas('counter', 1, cas=cas_token)  # 基于令牌更新  

Memcached 的高级功能

1. 分布式缓存与一致性哈希

当单台 Memcached 的容量不足时,可通过 多节点部署 实现分布式缓存。Memcached 本身不支持自动分片,需借助客户端库(如 libmemcached)或外部工具(如 Mcrouter)实现 一致性哈希,确保数据均匀分布且节点增减时迁移量最小。

2. 多级缓存策略

结合数据库和 Memcached,可以设计 多级缓存

def get_user_profile(user_id):  
    # 第一步:从 Memcached 获取  
    profile = clients.get(f'user:{user_id}:profile')  
    if profile is not None:  
        return profile  

    # 第二步:从数据库查询  
    profile = query_database(user_id)  

    # 第三步:缓存结果  
    clients.set(f'user:{user_id}:profile', profile, time=3600)  
    return profile  

3. 安全性配置

Memcached 默认不启用密码验证,可通过配置文件开启 SASL(Simple Authentication and Security Layer)

-a /etc/memcached/passwd  

随后使用 saslauthd 工具管理用户权限。


实际应用场景与案例

1. 用户登录状态缓存

在 Web 应用中,用户登录后生成的 Session 数据通常存储在数据库,这会增加数据库负载。通过 Memcached 缓存 Session,可显著提升性能:

clients.set(session_id, user_info, time=3600)  

user_info = clients.get(session_id)  

2. 高频查询数据缓存

假设某电商网站的“热销商品列表”每秒被请求数百次,直接查询数据库会导致性能瓶颈。通过 Memcached 缓存查询结果:

def get_hot_products():  
    products = clients.get('hot_products')  
    if not products:  
        products = fetch_hot_products_from_db()  
        clients.set('hot_products', products, time=300)  # 5分钟刷新一次  
    return products  

3. 结合 Web 框架的案例(以 Django 为例)

在 Django 中,可通过 django-memcached 中间件配置缓存:

CACHES = {  
    'default': {  
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  
        'LOCATION': '127.0.0.1:11211',  
    }  
}  

随后在视图中使用装饰器缓存页面:

from django.views.decorators.cache import cache_page  

@cache_page(60 * 15)  # 缓存 15 分钟  
def home_view(request):  
    return render(request, 'home.html')  

最佳实践与注意事项

1. 缓存雪崩与雪崩预防

缓存雪崩指大量键同时过期,导致数据库瞬间被压垮。解决方案包括:

  • 随机过期时间:对相同键设置随机的 exptime(如 600 ± 30秒)。
  • 永不过期键:对关键数据设置永久缓存,通过手动更新。

2. 合理设置过期时间

  • 热点数据:如用户登录态,设置较短时间(如 30分钟)。
  • 静态数据:如商品分类,可设置较长的过期时间(如 24小时)。

3. 监控与日志

定期检查 Memcached 的统计信息:

echo "stats" | nc localhost 11211  

结论

Memcached 是一款强大且易用的缓存工具,通过本教程,你已掌握了从安装、基础操作到高级场景的完整流程。无论是优化 Web 应用性能,还是为分布式系统设计缓存层,Memcached 都能提供高效的支持。

对于进阶学习,建议进一步研究:

  • Redis(支持更复杂的数据结构和持久化)
  • 一致性哈希算法(分布式缓存的核心原理)
  • 缓存预热(在系统启动时提前加载热点数据)

通过实践,你将更好地理解缓存技术如何为系统性能保驾护航!

最新发布