$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->set('key', 'value', 3600); $value = $redis->get('key'); // 基本设置和获取,带过期时间解决缓存失效。 $redis->setex('user:1', 3600, json_encode($userData)); // 高效缓存用户数据。 对于并发,$redis->setnx('lock:key', time() + 60); if ($redis->get('lock:key') < time()) { $redis->del('lock:key'); } // 简单分布式锁实现,避免并发冲突,提升Web性能。
连接Redis并基本操作
首先安装phpredis扩展:pecl install redis。代码示例:<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Connected to Redis "; $redis->set('test', 'hello world'); echo $redis->get('test'); // 输出 hello world。 这就是PHP连接Redis并进行简单set/get操作的基础。
缓存热点数据解决瓶颈
在Web应用中,数据库查询慢,用Redis缓存:function getUser($id) { $key = "user:$id"; $user = $redis->get($key); if ($user === false) { $user = $db->query("SELECT * FROM users WHERE id=$id"); $redis->setex($key, 1800, json_encode($user)); } return json_decode($user, true); } 这样热点数据直接从内存返回,极大提升响应速度。
使用Pipeline批量操作减少RTT
单次命令来回网络开销大,用pipeline:$pipe = $redis->pipeline(); $pipe->set('key1', 'val1'); $pipe->set('key2', 'val2'); $pipe->get('key1'); $replies = $pipe->exec(); 批量执行,减少网络往返时间,特别适合高并发场景。
Redis List实现消息队列
解决并发任务堆积:$redis->lpush('tasks', json_encode($task)); $task = $redis->brpop('tasks', 5); // 阻塞弹出,避免空轮询。 这在Web后台任务处理中很实用,释放主进程压力。
分布式锁防范超卖
电商库存并发问题:function decrementStock($productId, $quantity) { $lockKey = "lock:stock:$productId"; while (true) { if ($redis->set($lockKey, time() + 10, ['nx', 'ex' => 10])) { $stock = $redis->get("stock:$productId") ?: 100; if ($stock >= $quantity) { $redis->set("stock:$productId", $stock - $quantity); } $redis->del($lockKey); return true; } usleep(10000); } } 防止库存超卖,确保数据一致性。
Session存储到Redis
配置php.ini:session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379" 多服务器共享session,解决单机session瓶颈。
监控和优化
用$redis->info()查看内存使用,设置maxmemory-policy allkeys-lru。定期清理过期key,避免内存爆炸。
FAQ
Q: Redis连接失败怎么办?
A: 检查ip端口,确认redis服务运行,防火墙放行6379端口。
Q: 缓存穿透怎么解决?
A: 缓存空值,设短过期时间,或用布隆过滤器。
Q: PHP Redis扩展哪个好?
A: predis纯PHP库简单,phpredis C扩展性能高推荐生产。
Q: 大key怎么处理?
A: 分片存储,或用hash结构拆分。