PHP 入门教程
PHP 与 Redis 基础
本教程共 65 篇 · 第 58 篇 · 更新于 2026-07-24 · 约 10 分钟阅读
PHPPHP8Redis缓存键值对NoSQL性能优化
58. PHP 与 Redis 基础
本节目标:了解 Redis 的常用数据类型,能够在 PHP 中连接 Redis 并进行基本的读写操作。
Redis 是一个高性能的键值对数据库,数据存储在内存中,读写速度极快。它常用于缓存、会话存储、计数器等场景,是 PHP 应用的标准配套组件。
1. Redis 简介
Redis 全称 Remote Dictionary Server,特点:
- 内存存储:读写速度远超关系型数据库
- 数据类型丰富:字符串、哈希、列表、集合、有序集合
- 持久化支持:可将内存数据保存到磁盘
- 单线程模型:避免并发问题,命令原子执行
NoteRedis 不是 MySQL 的替代品,而是补充。MySQL 存持久化数据,Redis 存热点数据。
2. 安装 Redis 扩展
PHP 操作 Redis 需要安装 phpredis 扩展:
# Ubuntu/Debian
sudo apt-get install php-redis
# 或 pecl 安装
pecl install redis
在 php.ini 中确认:
extension=redis
3. 连接 Redis
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 如果设置了密码
$redis->auth('your_password');
// 测试连接
echo $redis->ping(); // 输出 +PONG
4. 字符串操作
字符串是 Redis 最基础的数据类型。
<?php
// 设置键值(永久)
$redis->set('site_name', '我的网站');
// 设置键值(过期时间 60 秒)
$redis->set('verify_code', '123456', 60);
// 获取值
$name = $redis->get('site_name');
echo $name;
// 自增计数器
$redis->set('page_views', 0);
$redis->incr('page_views'); // +1
$redis->incrBy('page_views', 5); // +5
$views = $redis->get('page_views');
// 删除键
$redis->del('verify_code');
Tip设置验证码、缓存等临时数据时,务必加上过期时间,防止内存无限增长。
5. 哈希操作
哈希适合存储对象型的数据。
<?php
// 存储用户资料
$redis->hSet('user:1', 'name', '张三');
$redis->hSet('user:1', 'email', 'zhang@example.com');
$redis->hSet('user:1', 'age', '25');
// 批量设置
$redis->hMSet('user:2', [
'name' => '李四',
'email' => 'li@example.com',
'age' => 30
]);
// 获取单个字段
$email = $redis->hGet('user:1', 'email');
// 获取全部字段
$user = $redis->hGetAll('user:1');
print_r($user);
// 删除字段
$redis->hDel('user:1', 'age');
6. 列表操作
列表是有序的字符串集合,适合实现队列。
<?php
// 左侧添加(栈/队列)
$redis->lPush('tasks', '发送邮件');
$redis->lPush('tasks', '生成报表');
// 右侧添加
$redis->rPush('tasks', '清理日志');
// 获取列表长度
$count = $redis->lLen('tasks');
// 左侧弹出(消费队列)
$task = $redis->lPop('tasks');
echo "处理任务:{$task}";
// 获取范围元素
$items = $redis->lRange('tasks', 0, -1); // 全部
Note
lPush+rPop是队列(FIFO),lPush+lPop是栈(LIFO)。
7. 集合操作
集合是无序且唯一的元素集合。
<?php
// 添加成员
$redis->sAdd('tags:post_1', 'PHP', 'Redis', '缓存');
$redis->sAdd('tags:post_2', 'PHP', 'MySQL');
// 获取所有成员
$tags = $redis->sMembers('tags:post_1');
// 判断是否是成员
$isMember = $redis->sIsMember('tags:post_1', 'PHP'); // true
// 交集:同时属于两个集合的元素
$common = $redis->sInter('tags:post_1', 'tags:post_2'); // ['PHP']
// 获取成员数量
$count = $redis->sCard('tags:post_1');
8. 缓存实战示例
<?php
function getUserById(PDO $pdo, Redis $redis, int $id): ?array
{
$cacheKey = "user:{$id}";
// 先查缓存
$user = $redis->hGetAll($cacheKey);
if (!empty($user)) {
return $user;
}
// 缓存未命中,查数据库
$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id = ?");
$stmt->execute([$id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
// 写入缓存,设置 5 分钟过期
$redis->hMSet($cacheKey, $user);
$redis->expire($cacheKey, 300);
}
return $user ?: null;
}
Tip缓存策略常用”先读缓存,再读数据库,最后写缓存”的模式,称为 Cache-Aside 模式。
小结
Redis 是提升 PHP 应用性能的利器。字符串、哈希、列表、集合四种类型覆盖了大部分场景。配合过期时间使用,能有效降低数据库压力。
来源:参考了 Redis 官方文档、php-the-right-way,改写后所得。