1. Linux系统级缓存(Buffers与Cached)
Linux内核通过Buffers(缓存块设备数据,如磁盘写入缓冲)和Cached(缓存文件系统数据,如频繁访问的文件)优化I/O性能。这些缓存由内核自动管理,无需手动配置,可通过free -h命令查看使用情况(buff/cache列)。定期执行sync && echo 3 > /proc/sys/vm/drop_caches可手动释放Cached内存(生产环境需谨慎,避免影响正在运行的服务)。
2. Apache缓存模块(mod_cache与mod_expires)
Apache的mod_cache(磁盘/内存缓存)与mod_expires(HTTP头控制)可减少重复请求的处理时间。
sudo yum install mod_cache mod_cache_disk mod_expires # CentOS
sudo systemctl restart httpd
/etc/httpd/conf/httpd.conf),添加:# 磁盘缓存配置
CacheRoot "/var/cache/apache2/mod_cache_disk"
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
# HTTP头控制(设置静态资源过期时间)
ExpiresActive On
ExpiresByType text/html "access plus 1 hour"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
重启Apache使配置生效。3. PHP缓存加速(OPcache与APCu)
php.ini(如/etc/php.ini),启用OPcache:[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 内存大小(MB)
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60 # 脚本重新验证间隔(秒)
sudo yum install php-pecl-apcu # CentOS
sudo systemctl restart php-fpm
编辑php.ini启用:[apcu]
extension=apcu.so
apcu.enable_cli=1
apcu.shm_size=32M
PHP代码中使用示例:$data = apcu_fetch('my_key');
if ($data === false) {
$data = fetchDataFromDB(); // 从数据库获取数据
apcu_store('my_key', $data, 3600); // 缓存1小时
}
```。
4. 数据库缓存(MySQL查询缓存与InnoDB缓冲池)
/etc/mysql/my.cnf),启用查询缓存:[mysqld]
query_cache_type=1 # 开启查询缓存(0=关闭,1=开启,2=按需)
query_cache_size=64M # 缓存大小
query_cache_limit=2M # 单条查询最大缓存大小
my.cnf调整缓冲池大小(建议设置为系统内存的50%-80%):[mysqld]
innodb_buffer_pool_size=1G
innodb_buffer_pool_instances=8 # 缓冲池实例数(多核CPU建议设置为8及以上)
重启MySQL使配置生效。5. 分布式缓存(Redis与Memcached)
Redis与Memcached是高性能的内存缓存系统,适用于缓存热点数据(如商品详情、用户会话),减轻数据库压力。
sudo yum install redis # CentOS
sudo systemctl start redis
sudo systemctl enable redis
PHP使用Redis扩展(php-redis):sudo yum install php-pecl-redis
sudo systemctl restart php-fpm
代码示例(缓存商品详情):$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = "product:{$productId}";
$data = $redis->get($cacheKey);
if ($data === false) {
$data = $pdo->query("SELECT * FROM products WHERE id = {$productId}")->fetch();
$redis->setex($cacheKey, 3600, json_encode($data)); // 缓存1小时
} else {
$data = json_decode($data, true);
}
sudo yum install memcached php-pecl-memcached # CentOS
sudo systemctl start memcached
sudo systemctl enable memcached
PHP使用Memcached扩展:$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);
$data = $memcached->get($cacheKey);
if ($data === false) {
$data = fetchDataFromDB();
$memcached->set($cacheKey, $data, 3600);
}
缓存失效策略:当数据更新时,需主动删除缓存(如更新商品信息后,删除对应的Redis键),确保下次获取最新数据。6. Web服务器缓存(Nginx反向代理缓存)
若使用Nginx作为反向代理,可通过proxy_cache缓存后端Apache的响应,减少Apache的负载。
/etc/nginx/nginx.conf),添加:http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_apache; # 后端Apache地址
proxy_cache my_cache;
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
add_header X-Proxy-Cache $upstream_cache_status; # 显示缓存状态(HIT/MISS/BYPASS)
}
}
}
重启Nginx使配置生效。通过X-Proxy-Cache头可查看缓存是否命中(HIT表示命中缓存)。