Redis缓存实战:给网站加速10倍的简单方案

Redis缓存实战:给网站加速10倍的简单方案

如果你的网站加载时间超过2秒,有近一半的用户会直接离开。而数据库查询往往是页面加载中最慢的环节。Redis作为内存缓存,可以将频繁访问的数据的读取时间从几十毫秒降到微秒级别,让网站快得像静态页面。

1. Redis的安装与基础配置

# Debian/Ubuntu安装
apt install redis-server

# 或从源码编译最新版
wget https://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz && cd redis-stable && make && make install

基础安全配置(编辑/etc/redis/redis.conf):

# 绑定内网IP(不要用0.0.0.0)
bind 127.0.0.1
# 设置密码
requirepass your_strong_password
# 禁用危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""

2. 缓存策略:什么时候用Redis

不是所有数据都适合放Redis。以下场景收益最高:

Session存储:用户登录状态、购物车等会话数据,天然适合Redis的key-value模型。

数据库查询缓存:高频但低频变更的数据,比如文章详情、分类列表、用户资料。缓存后数据库查询量可以降低80%。

计数器/排行榜INCR命令原子递增计数,ZADD维护有序集合做排行榜,比MySQL的UPDATE count=count+1快几个数量级。

限流器:用EXPIRE设置key的过期时间,配合INCR统计单位时间内的请求次数。

消息队列:虽然RabbitMQ更专业,但Redis的List和Pub/Sub可以做轻量级消息传递。

3. PHP中使用Redis

以WordPress和Typecho为例,PHP连接Redis通常用Predis或phpredis扩展:

// 使用Predis(纯PHP实现,无需扩展)
$redis = new Predis\Client([
    'scheme' => 'tcp',
    'host' => '127.0.0.1',
    'port' => 6379,
    'password' => 'your_password',
]);

// 缓存文章数据
$cacheKey = 'post:' . $postId;
$post = $redis->get($cacheKey);
if (!$post) {
    $post = $db->query("SELECT * FROM posts WHERE id = ?", $postId);
    $redis->setex($cacheKey, 3600, json_encode($post)); // 缓存1小时
}

WordPress推荐用Redis Object Cache插件,Typecho可以写一个简易缓存中间件。

4. 缓存失效——最棘手的问题

缓存最大的挑战不是怎么存,而是什么时候删。几个常用策略:

TTL自动过期:最简单。设置合理的过期时间,数据在TTL内可能不准确但总会更新。适合对实时性要求不高的场景。

主动失效:更新数据时同步删除缓存。在文章更新或评论新增时,删除对应的缓存key。

Cache-Aside模式:读的时候如果缓存未命中就读数据库然后写缓存,更新的时候先更新数据库然后删除缓存。这是最常用的模式。

写穿透:更新数据库的同时更新缓存。保证缓存和数据库一致,但写操作变慢且可能产生脏数据。

5. 监控与优化

Redis自带的INFO命令提供丰富的运行时信息:

redis-cli INFO stats | grep -E 'keyspace_hits|keyspace_misses'

计算缓存命中率 = hits/(hits+misses),目标保持在95%以上。命中率低说明缓存策略需要调整——可能TTL太短或者缓存了不该缓存的数据。

内存使用:redis-cli INFO memory | grep used_memory_human。当内存接近maxmemory时Redis会根据maxmemory-policy策略淘汰数据。allkeys-lru(淘汰最近最少使用的键)是最常用的策略。

慢查询日志:redis-cli SLOWLOG GET 10 查看最近10条慢查询。Redis的单线程模型决定了任何慢操作都会阻塞其他请求。

引入Redis缓存是性价比最高的性能优化手段。一个512MB的Redis实例就能让大多数中小网站的响应时间降低一个数量级。

Last modification:July 12th, 2026 at 03:59 pm

Leave a Comment