Memcached 教程(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
什么是 Memcached?
Memcached 是一个高性能的分布式内存对象缓存系统,最初由 Danga Interactive 公司为了解决高并发场景下的数据库压力而开发。它通过将数据缓存在内存中,减少对数据库的直接访问,从而提升应用的响应速度和吞吐量。
Memcached 的核心功能可以用一个 “临时记忆” 的比喻来理解:假设你的大脑需要频繁回忆某个复杂信息,但每次都要从书本中查找会很慢。Memcached 就像大脑的临时记忆区,将常用信息直接存放在容易访问的地方,需要时快速调用,避免重复计算或查询。
为什么选择 Memcached?
Memcached 的优势体现在以下几个方面:
- 高性能:基于内存存储,读写速度可达 10万次/秒以上。
- 分布式架构:支持多节点扩展,适用于大规模系统。
- 轻量级:仅需极少的资源即可运行,兼容多种编程语言。
- 简单易用:API 接口简洁,学习成本低。
对于初学者来说,Memcached 是学习缓存技术的绝佳起点,因为它能直观地展示如何通过缓存优化应用性能。
Memcached 的核心概念与工作原理
1. 缓存的基本概念
缓存的目的是 “先存后取,减少重复劳动”。例如,当用户请求某个热门文章的详细信息时,数据库可能需要多次查询才能返回结果。通过 Memcached,首次查询后,数据会被缓存到内存中,后续请求直接从内存读取,避免重复查询数据库。
2. Memcached 的架构设计
Memcached 采用 Client-Server 架构:
- 客户端:应用通过 API 向 Memcached 发送命令(如
set
、get
)。 - 服务端:负责接收命令、存储数据,并通过 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-memcached
或 pylibmc
库与 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(支持更复杂的数据结构和持久化)
- 一致性哈希算法(分布式缓存的核心原理)
- 缓存预热(在系统启动时提前加载热点数据)
通过实践,你将更好地理解缓存技术如何为系统性能保驾护航!