首页 / PHP 入门教程 / PHP 与 Redis 基础

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,特点:

  • 内存存储:读写速度远超关系型数据库
  • 数据类型丰富:字符串、哈希、列表、集合、有序集合
  • 持久化支持:可将内存数据保存到磁盘
  • 单线程模型:避免并发问题,命令原子执行
Note

Redis 不是 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,改写后所得。