1. 首页 > Memcached教程 > 正文

Memcached教程FG016-Memcached页面缓存与数据缓存实战

内容简介:
本文详细介绍Memcached页面缓存与数据缓存实现方案,包括页面缓存原理、数据缓存策略、缓存更新机制、缓存穿透防护、缓存雪崩预防以及生产环境缓存最佳实践。风哥教程参考Memcached官方文档Cache Patterns、Best Practices等章节内容。

目录大纲

Part01-基础概念与理论知识
    1.1 Memcached页面缓存原理
    1.2 Memcached数据缓存策略
    1.3 Memcached缓存更新机制
Part02-生产环境规划与建议
    2.1 Memcached缓存架构设计
    2.2 Memcached缓存策略规划
    2.3 Memcached缓存容量规划
Part03-生产环境项目实施方案
    3.1 Memcached页面缓存实现
    3.2 Memcached数据缓存实现
    3.3 Memcached缓存更新方案
Part04-生产案例与实战讲解
    4.1 Memcached缓存穿透防护
    4.2 Memcached缓存雪崩预防
    4.3 Memcached缓存案例解析
Part05-风哥经验总结与分享
    5.1 Memcached缓存设计经验
    5.2 Memcached缓存优化方案
    5.3 Memcached缓存最佳实践

Part01-基础概念与理论知识

1.1 Memcached页面缓存原理

页面缓存是将动态生成的HTML页面存储在Memcached中,当用户请求相同页面时直接返回缓存内容,避免重复计算和数据库查询。更多视频教程www.fgedu.net.cn。页面缓存适用于内容变化不频繁的页面,如首页、列表页、详情页等。页面缓存的核心思想是以空间换时间,用内存存储换取响应速度提升。

页面缓存的实现流程:用户请求页面,应用首先检查Memcached中是否存在缓存;如果存在缓存且未过期,直接返回缓存内容;如果不存在缓存或已过期,执行业务逻辑生成页面,将页面存入Memcached并返回。学习交流加群风哥微信: itpux-com。这种方式可以大幅减少数据库压力和服务器负载。

1.2 Memcached数据缓存策略

数据缓存是将数据库查询结果或计算结果存储在Memcached中,后续请求直接从缓存获取数据。常见的数据缓存策略:Cache-Aside,应用代码负责维护缓存;Read-Through,缓存代理负责读取数据;Write-Through,写入时同时更新缓存;Write-Behind,异步更新缓存。from Memcached视频:www.itpux.com。

风哥提示:Cache-Aside是最常用的缓存策略,应用代码控制灵活,但需要处理缓存一致性问题。

1.3 Memcached缓存更新机制

缓存更新机制是保证缓存数据一致性的关键:主动更新,数据变更时主动更新或删除缓存;被动更新,缓存过期后重新加载;定时更新,定时任务刷新缓存;增量更新,只更新变化的部分数据。选择合适的更新机制需要根据业务特点和数据变化频率决定。更多学习教程公众号风哥教程itpux_com。

# 查看Memcached缓存状态
# echo “stats” | nc 192.168.1.101 11211 | grep -E ‘get_hits|get_misses|bytes’

[root@fgedu101 ~]# echo “stats” | nc 192.168.1.101 11211 | grep -E ‘get_hits|get_misses|bytes’
STAT get_hits 12345678
STAT get_misses 1234567
STAT bytes 16106127360

Part02-生产环境规划与建议

2.1 Memcached缓存架构设计

生产环境Memcached缓存架构设计:应用层,Web应用通过客户端库访问Memcached;缓存层,Memcached集群存储缓存数据;数据层,数据库存储持久化数据;监控层,监控缓存命中率和性能指标。缓存架构设计需要考虑高可用、可扩展和容错能力。学习交流加群风哥QQ113257174。

# 缓存架构规划
# cat > /memcached/app/config/cache_arch.conf << 'EOF'
# Memcached缓存架构配置
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# Memcached集群节点
CACHE_NODES=192.168.1.101:11211,192.168.1.102:11211,192.168.1.103:11211

# 页面缓存过期时间(秒)
PAGE_CACHE_TTL=300

# 数据缓存过期时间(秒)
DATA_CACHE_TTL=3600

# 缓存Key前缀
CACHE_PREFIX=fgedu_cache:

# 缓存压缩阈值(字节)
COMPRESS_THRESHOLD=10240
EOF

[root@fgedu101 ~]# cat > /memcached/app/config/cache_arch.conf << 'EOF'
> # Memcached缓存架构配置
> # from:www.itpux.com.qq113257174.wx:itpux-com
> # web: http://www.fgedu.net.cn
>
> # Memcached集群节点
> CACHE_NODES=192.168.1.101:11211,192.168.1.102:11211,192.168.1.103:11211
>
> # 页面缓存过期时间(秒)
> PAGE_CACHE_TTL=300
>
> # 数据缓存过期时间(秒)
> DATA_CACHE_TTL=3600
>
> # 缓存Key前缀
> CACHE_PREFIX=fgedu_cache:
>
> # 缓存压缩阈值(字节)
> COMPRESS_THRESHOLD=10240
> EOF

2.2 Memcached缓存策略规划

缓存策略规划需要考虑:缓存对象选择,选择热点数据和计算密集型数据进行缓存;过期时间设置,根据数据变化频率设置合理的过期时间;缓存粒度,选择合适的缓存粒度,避免缓存过细或过粗;缓存预热,系统启动时预热关键缓存数据。from Memcached视频:www.itpux.com。

2.3 Memcached缓存容量规划

缓存容量规划需要考虑:数据量估算,估算需要缓存的数据总量;内存分配,为不同类型缓存分配合理的内存;增长预留,预留一定的内存增长空间;淘汰策略,配置合适的淘汰策略应对内存不足。更多视频教程www.fgedu.net.cn。

Part03-生产环境项目实施方案

3.1 Memcached页面缓存实现

实现Memcached页面缓存功能。学习交流加群风哥微信: itpux-com。

# PHP页面缓存实现
# cat > /var/www/html/page_cache.php << 'EOF'
// page_cache.php
// from:www.itpux.com.qq113257174.wx:itpux-com
// web: http://www.fgedu.net.cn

$memcached = new Memcached();
$memcached->addServer(‘192.168.1.101’, 11211);
$memcached->addServer(‘192.168.1.102’, 11211);
$memcached->addServer(‘192.168.1.103’, 11211);

class PageCache {
private $mc;
private $prefix = ‘fgedu_page:’;
private $ttl = 300; // 5分钟

public function __construct($memcached) {
$this->mc = $memcached;
}

// 获取页面缓存
public function get($pageKey) {
$cacheKey = $this->prefix . $pageKey;
$content = $this->mc->get($cacheKey);
if ($content) {
echo “命中缓存: $pageKey\n”;
return $content;
}
echo “缓存未命中: $pageKey\n”;
return null;
}

// 设置页面缓存
public function set($pageKey, $content) {
$cacheKey = $this->prefix . $pageKey;
$result = $this->mc->set($cacheKey, $content, $this->ttl);
if ($result) {
echo “缓存设置成功: $pageKey, 大小: ” . strlen($content) . ” 字节\n”;
}
return $result;
}

// 删除页面缓存
public function delete($pageKey) {
$cacheKey = $this->prefix . $pageKey;
$this->mc->delete($cacheKey);
echo “缓存已删除: $pageKey\n”;
}

// 清空所有页面缓存
public function flush() {
$this->mc->flush();
echo “所有缓存已清空\n”;
}
}

// 使用示例
$cache = new PageCache($memcached);
$pageKey = ‘home_page_’ . date(‘YmdH’);

// 尝试获取缓存
$content = $cache->get($pageKey);

if (!$content) {
// 生成页面内容
$content = ““;
$content .= “

欢迎访问风哥教程

“;
$content .= “

页面生成时间: ” . date(‘Y-m-d H:i:s’) . “

“;
$content .= “

更多视频教程www.fgedu.net.cn

“;
$content .= “”;

// 设置缓存
$cache->set($pageKey, $content);
}

echo $content;
?>
EOF

[root@fgedu101 ~]# cat > /var/www/html/page_cache.php << 'EOF'
> > // page_cache.php
> // from:www.itpux.com.qq113257174.wx:itpux-com
> // web: http://www.fgedu.net.cn
>
> $memcached = new Memcached();
> $memcached->addServer(‘192.168.1.101’, 11211);
> $memcached->addServer(‘192.168.1.102’, 11211);
> $memcached->addServer(‘192.168.1.103’, 11211);
>
> class PageCache {
> private $mc;
> private $prefix = ‘fgedu_page:’;
> private $ttl = 300; // 5分钟
>
> public function __construct($memcached) {
> $this->mc = $memcached;
> }
>
> // 获取页面缓存
> public function get($pageKey) {
> $cacheKey = $this->prefix . $pageKey;
> $content = $this->mc->get($cacheKey);
> if ($content) {
> echo “命中缓存: $pageKey\n”;
> return $content;
> }
> echo “缓存未命中: $pageKey\n”;
> return null;
> }
>
> // 设置页面缓存
> public function set($pageKey, $content) {
> $cacheKey = $this->prefix . $pageKey;
> $result = $this->mc->set($cacheKey, $content, $this->ttl);
> if ($result) {
> echo “缓存设置成功: $pageKey, 大小: ” . strlen($content) . ” 字节\n”;
> }
> return $result;
> }
>
> // 删除页面缓存
> public function delete($pageKey) {
> $cacheKey = $this->prefix . $pageKey;
> $this->mc->delete($cacheKey);
> echo “缓存已删除: $pageKey\n”;
> }
>
> // 清空所有页面缓存
> public function flush() {
> $this->mc->flush();
> echo “所有缓存已清空\n”;
> }
> }
>
> // 使用示例
> $cache = new PageCache($memcached);
> $pageKey = ‘home_page_’ . date(‘YmdH’);
>
> // 尝试获取缓存
> $content = $cache->get($pageKey);
>
> if (!$content) {
> // 生成页面内容
> $content = ““;
> $content .= “

欢迎访问风哥教程

“;
> $content .= “

页面生成时间: ” . date(‘Y-m-d H:i:s’) . “

“;
> $content .= “

更多视频教程www.fgedu.net.cn

“;
> $content .= “”;
>
> // 设置缓存
> $cache->set($pageKey, $content);
> }
>
> echo $content;
> ?>
> EOF

3.2 Memcached数据缓存实现

实现Memcached数据缓存功能。from Memcached视频:www.itpux.com。

# Python数据缓存实现
# cat > /memcached/app/python/data_cache.py << 'EOF'
#!/usr/bin/env python3
# data_cache.py
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

import pymemcache
from pymemcache.client.base import Client
import json
import hashlib

class DataCache:
def __init__(self, servers):
self.servers = servers
self.prefix = ‘fgedu_data:’
self.default_ttl = 3600

def _get_client(self, key):
# 简单的一致性哈希选择节点
server_index = int(hashlib.md5(key.encode()).hexdigest(), 16) % len(self.servers)
host, port = self.servers[server_index].split(‘:’)
return Client((host, int(port)))

def get(self, key):
cache_key = self.prefix + key
client = self._get_client(cache_key)
try:
result = client.get(cache_key)
if result:
print(f”缓存命中: {key}”)
return json.loads(result.decode())
print(f”缓存未命中: {key}”)
return None
except Exception as e:
print(f”缓存读取错误: {e}”)
return None

def set(self, key, value, ttl=None):
cache_key = self.prefix + key
client = self._get_client(cache_key)
if ttl is None:
ttl = self.default_ttl
try:
data = json.dumps(value)
client.set(cache_key, data, expire=ttl)
print(f”缓存设置成功: {key}, TTL: {ttl}秒”)
except Exception as e:
print(f”缓存设置错误: {e}”)

def delete(self, key):
cache_key = self.prefix + key
client = self._get_client(cache_key)
try:
client.delete(cache_key)
print(f”缓存已删除: {key}”)
except Exception as e:
print(f”缓存删除错误: {e}”)

def get_or_set(self, key, callback, ttl=None):
# 先尝试获取缓存,不存在则执行回调并缓存结果
value = self.get(key)
if value is not None:
return value

# 执行回调获取数据
value = callback()
if value is not None:
self.set(key, value, ttl)
return value

# 使用示例
if __name__ == ‘__main__’:
servers = [‘192.168.1.101:11211’, ‘192.168.1.102:11211’, ‘192.168.1.103:11211’]
cache = DataCache(servers)

# 模拟数据库查询
def get_user_info(user_id):
print(f”从数据库查询用户信息: {user_id}”)
return {
‘user_id’: user_id,
‘username’: f’fgedu_user_{user_id}’,
’email’: f’fgedu{user_id}@fgedu.net.cn’,
‘created_at’: ‘2026-04-08 12:00:00’
}

# 使用缓存
user_id = ‘10001’
user_info = cache.get_or_set(
f’user:{user_id}’,
lambda: get_user_info(user_id),
ttl=1800
)
print(f”用户信息: {user_info}”)
EOF

# chmod +x /memcached/app/python/data_cache.py

[root@fgedu101 ~]# cat > /memcached/app/python/data_cache.py << 'EOF'
> #!/usr/bin/env python3
> # data_cache.py
> # from:www.itpux.com.qq113257174.wx:itpux-com
> # web: http://www.fgedu.net.cn
>
> import pymemcache
> from pymemcache.client.base import Client
> import json
> import hashlib
>
> class DataCache:
> def __init__(self, servers):
> self.servers = servers
> self.prefix = ‘fgedu_data:’
> self.default_ttl = 3600
>
> def _get_client(self, key):
> # 简单的一致性哈希选择节点
> server_index = int(hashlib.md5(key.encode()).hexdigest(), 16) % len(self.servers)
> host, port = self.servers[server_index].split(‘:’)
> return Client((host, int(port)))
>
> def get(self, key):
> cache_key = self.prefix + key
> client = self._get_client(cache_key)
> try:
> result = client.get(cache_key)
> if result:
> print(f”缓存命中: {key}”)
> return json.loads(result.decode())
> print(f”缓存未命中: {key}”)
> return None
> except Exception as e:
> print(f”缓存读取错误: {e}”)
> return None
>
> def set(self, key, value, ttl=None):
> cache_key = self.prefix + key
> client = self._get_client(cache_key)
> if ttl is None:
> ttl = self.default_ttl
> try:
> data = json.dumps(value)
> client.set(cache_key, data, expire=ttl)
> print(f”缓存设置成功: {key}, TTL: {ttl}秒”)
> except Exception as e:
> print(f”缓存设置错误: {e}”)
>
> def delete(self, key):
> cache_key = self.prefix + key
> client = self._get_client(cache_key)
> try:
> client.delete(cache_key)
> print(f”缓存已删除: {key}”)
> except Exception as e:
> print(f”缓存删除错误: {e}”)
>
> def get_or_set(self, key, callback, ttl=None):
> # 先尝试获取缓存,不存在则执行回调并缓存结果
> value = self.get(key)
> if value is not None:
> return value
>
> # 执行回调获取数据
> value = callback()
> if value is not None:
> self.set(key, value, ttl)
> return value
>
> # 使用示例
> if __name__ == ‘__main__’:
> servers = [‘192.168.1.101:11211’, ‘192.168.1.102:11211’, ‘192.168.1.103:11211’]
> cache = DataCache(servers)
>
> # 模拟数据库查询
> def get_user_info(user_id):
> print(f”从数据库查询用户信息: {user_id}”)
> return {
> ‘user_id’: user_id,
> ‘username’: f’fgedu_user_{user_id}’,
> ’email’: f’fgedu{user_id}@fgedu.net.cn’,
> ‘created_at’: ‘2026-04-08 12:00:00’
> }
>
> # 使用缓存
> user_id = ‘10001’
> user_info = cache.get_or_set(
> f’user:{user_id}’,
> lambda: get_user_info(user_id),
> ttl=1800
> )
> print(f”用户信息: {user_info}”)
> EOF

[root@fgedu101 ~]# chmod +x /memcached/app/python/data_cache.py

3.3 Memcached缓存更新方案

实现Memcached缓存更新机制。更多视频教程www.fgedu.net.cn。

# 缓存更新脚本
# cat > /memcached/app/scripts/cache_updater.sh << 'EOF'
#!/bin/bash
# cache_updater.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

HOST=”192.168.1.101″
PORT=”11211″

# 更新指定缓存
update_cache() {
KEY=$1
echo “更新缓存: $KEY”
echo “delete fgedu_cache:$KEY” | nc $HOST $PORT
echo “缓存已删除,下次访问将重新生成”
}

# 批量更新缓存
batch_update() {
PATTERN=$1
echo “批量更新匹配 $PATTERN 的缓存…”
# 注意:Memcached不支持批量删除,需要逐个处理
echo “请使用应用层逻辑实现批量缓存更新”
}

# 预热缓存
warmup_cache() {
echo “预热缓存…”
# 调用应用接口预热缓存
curl -s http://localhost/warmup_cache.php > /dev/null
echo “缓存预热完成”
}

case “$1” in
update)
update_cache $2
;;
batch)
batch_update $2
;;
warmup)
warmup_cache
;;
*)
echo “用法: $0 {update|batch|warmup} [key|pattern]”
;;
esac
EOF

# chmod +x /memcached/app/scripts/cache_updater.sh

[root@fgedu101 ~]# cat > /memcached/app/scripts/cache_updater.sh << 'EOF'
> #!/bin/bash
> # cache_updater.sh
> # from:www.itpux.com.qq113257174.wx:itpux-com
> # web: http://www.fgedu.net.cn
>
> HOST=”192.168.1.101″
> PORT=”11211″
>
> # 更新指定缓存
> update_cache() {
> KEY=$1
> echo “更新缓存: $KEY”
> echo “delete fgedu_cache:$KEY” | nc $HOST $PORT
> echo “缓存已删除,下次访问将重新生成”
> }
>
> # 批量更新缓存
> batch_update() {
> PATTERN=$1
> echo “批量更新匹配 $PATTERN 的缓存…”
> # 注意:Memcached不支持批量删除,需要逐个处理
> echo “请使用应用层逻辑实现批量缓存更新”
> }
>
> # 预热缓存
> warmup_cache() {
> echo “预热缓存…”
> # 调用应用接口预热缓存
> curl -s http://localhost/warmup_cache.php > /dev/null
> echo “缓存预热完成”
> }
>
> case “$1” in
> update)
> update_cache $2
> ;;
> batch)
> batch_update $2
> ;;
> warmup)
> warmup_cache
> ;;
> *)
> echo “用法: $0 {update|batch|warmup} [key|pattern]”
> ;;
> esac
> EOF

[root@fgedu101 ~]# chmod +x /memcached/app/scripts/cache_updater.sh

Part04-生产案例与实战讲解

4.1 Memcached缓存穿透防护

缓存穿透是指查询不存在的数据,每次都穿透缓存直接访问数据库。更多视频教程www.fgedu.net.cn。防护方案:缓存空值,将不存在的数据也缓存为空值;布隆过滤器,使用布隆过滤器过滤不存在的Key;参数校验,在应用层进行参数合法性校验;限流保护,对频繁查询进行限流。

风哥提示:缓存空值时需要设置较短的过期时间,避免占用过多内存。

4.2 Memcached缓存雪崩预防

缓存雪崩是指大量缓存同时失效,导致数据库压力剧增。学习交流加群风哥微信: itpux-com。预防方案:过期时间随机化,在基础过期时间上增加随机值;缓存预热,系统启动时预热关键缓存;多级缓存,使用多级缓存架构分散压力;熔断降级,当缓存失效时进行熔断降级处理。

4.3 Memcached缓存案例解析

生产环境Memcached缓存实战案例:电商首页缓存,首页数据缓存5分钟,更新时主动刷新缓存;商品详情缓存,商品详情缓存1小时,价格变化时更新缓存;用户信息缓存,用户信息缓存30分钟,用户修改信息时删除缓存;热门商品缓存,热门商品列表缓存10分钟,定时任务更新。from Memcached视频:www.itpux.com。

Part05-风哥经验总结与分享

5.1 Memcached缓存设计经验

在多年生产环境实践中,总结出以下Memcached缓存设计经验:缓存Key设计,使用统一前缀和规范命名;过期时间设计,根据数据特点设置合理过期时间;缓存粒度设计,选择合适的缓存粒度;缓存更新设计,选择合适的更新策略保障一致性;监控告警设计,监控缓存命中率和性能指标。更多学习教程公众号风哥教程itpux_com。

5.2 Memcached缓存优化方案

Memcached缓存优化方案:压缩优化,对大数据进行压缩存储;批量操作,使用批量操作减少网络开销;连接池优化,使用连接池减少连接开销;序列化优化,选择高效的序列化格式;内存优化,合理配置内存大小和淘汰策略。

5.3 Memcached缓存最佳实践

Memcached缓存最佳实践总结:合理选择缓存对象,缓存热点数据和计算密集型数据;设置合理的过期时间,避免缓存雪崩;实现缓存穿透防护,保护后端数据库;建立缓存监控体系,及时发现缓存问题;制定缓存故障预案,保障系统稳定性。from Memcached视频:www.itpux.com。

风哥提示:缓存是把双刃剑,合理使用可以大幅提升性能,使用不当可能导致数据不一致和系统不稳定。

通过本文的学习,读者应该掌握了Memcached页面缓存和数据缓存的实现方法和最佳实践。在实际生产环境中,需要根据业务特点设计合理的缓存策略,确保系统高性能稳定运行。更多视频教程www.fgedu.net.cn。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息