0

0

PHP怎样使用Redis缓存?Predis客户端教程

看不見的法師

看不見的法師

发布时间:2025-08-12 17:52:01

|

302人浏览过

|

来源于php中文网

原创

php与redis的缓存协作核心是通过predis客户端实现,首先需用composer require predis/predis安装库,然后通过new client()连接redis,接着使用set、get、del等方法进行缓存操作,支持字符串和序列化后的复杂数据存储,建议对用户数据、查询结果等采用细粒度到粗粒度的分层缓存策略,设置合理ttl并结合管道提升性能,键名设计应规范如user:1:profile,优先使用json_encode序列化以保证跨语言兼容性,同时必须通过try-catch处理连接异常并实现降级至数据库的容错机制,确保缓存失效或服务不可用时应用仍可正常运行。

PHP怎样使用Redis缓存?Predis客户端教程

PHP与Redis的缓存协作,核心在于利用Predis这个强大的客户端库。它提供了一套直观的API,让开发者能够轻松地将数据存入Redis,实现快速读写,从而显著提升应用的响应速度和用户体验。

解决方案

使用Predis客户端在PHP中操作Redis缓存,首先需要通过Composer安装Predis库。

composer require predis/predis

安装完成后,就可以在PHP代码中实例化Predis客户端并进行操作了。最基础的缓存操作包括设置(set)、获取(get)和删除(del)。

立即学习PHP免费学习笔记(深入)”;

 'tcp',
        'host'   => '127.0.0.1',
        'port'   => 6379,
        // 如果Redis设置了密码,需要在这里添加
        // 'password' => 'your_redis_password',
        // 'database' => 0, // 选择数据库
    ]);

    // 缓存一个简单的字符串
    $key = 'my_simple_data';
    $value = 'Hello Redis Cache!';
    $redis->set($key, $value);
    echo "设置键 '{$key}' 成功,值为 '{$value}'\n";

    // 获取缓存数据
    $cachedValue = $redis->get($key);
    echo "获取键 '{$key}',值为 '{$cachedValue}'\n";

    // 设置带有过期时间的缓存 (例如:60秒)
    $expiringKey = 'user:1:profile';
    $userData = [
        'id' => 1,
        'name' => '张三',
        'email' => 'zhangsan@example.com'
    ];
    // 通常我们会把复杂数据结构序列化成字符串再存入Redis
    $redis->setex($expiringKey, 60, json_encode($userData)); // SETEX = SET with EXpiration
    echo "设置键 '{$expiringKey}' 成功,60秒后过期。\n";

    // 获取并解析缓存的用户数据
    $cachedUserDataJson = $redis->get($expiringKey);
    if ($cachedUserDataJson) {
        $cachedUserData = json_decode($cachedUserDataJson, true);
        echo "获取用户数据:\n";
        print_r($cachedUserData);
    } else {
        echo "用户数据缓存未命中或已过期。\n";
        // 实际应用中,这里会从数据库等数据源获取数据,并重新缓存
    }

    // 删除缓存
    $redis->del($key);
    echo "删除键 '{$key}' 成功。\n";
    $deletedValue = $redis->get($key);
    echo "再次获取键 '{$key}',值为 " . ($deletedValue === null ? 'null' : $deletedValue) . "\n";

} catch (Predis\Connection\ConnectionException $e) {
    echo "无法连接到Redis服务器: " . $e->getMessage() . "\n";
    // 实际应用中,这里应该有更健壮的错误处理和降级策略
} catch (Exception $e) {
    echo "发生错误: " . $e->getMessage() . "\n";
}

这段代码展示了Predis的基本用法,包括连接、设置字符串、设置带过期时间的JSON数据,以及获取和删除操作。在实际项目中,尤其要注意复杂数据的序列化和反序列化,

json_encode
json_decode
是比较常见的选择。

Predis客户端安装与基本连接

Predis作为PHP社区里用得比较多的Redis客户端,它的安装过程确实是挺顺畅的,基本就是靠Composer一条命令搞定。我个人觉得,对于PHP项目来说,依赖管理工具Composer简直是救星。

安装Predis:

composer require predis/predis

执行完这条命令,Composer会自动下载Predis库到你的

vendor
目录,并生成
autoload.php
文件。之后你只需要在PHP脚本开头引入
vendor/autoload.php
,就可以直接使用Predis提供的类了。

连接Redis服务器: 连接Redis,其实就是实例化

Predis\Client
类。最简单的连接方式,不带任何参数,它会默认尝试连接
127.0.0.1
6379
端口。

use Predis\Client;
$redis = new Client();

但实际项目里,Redis服务器往往不是跑在本地默认端口,或者会有密码保护。这时候就需要传递一个数组配置连接参数了:

阿里妈妈·创意中心
阿里妈妈·创意中心

阿里妈妈营销创意中心

下载
$redis = new Client([
    'scheme' => 'tcp',       // 连接协议,可以是tcp或tls
    'host'   => 'your_redis_host', // Redis服务器IP或域名
    'port'   => 6379,         // Redis端口
    'password' => 'your_redis_password', // 如果Redis设置了密码
    'database' => 0,         // 选择Redis数据库,默认是0
    // 'timeout' => 5.0,     // 连接超时时间,单位秒
    // 'read_write_timeout' => 5.0, // 读写超时时间
]);

我踩过的一个坑就是,有时候服务器网络波动或者Redis服务没启动,直接就抛连接异常了。所以,用

try-catch
块把连接代码包起来,处理
Predis\Connection\ConnectionException
是非常有必要的,这样能防止程序直接崩溃,给用户一个更友好的提示,或者至少能记录下错误日志。毕竟,缓存只是锦上添花,核心业务逻辑不能因为缓存挂了就跟着挂。

PHP如何利用Redis实现不同粒度的缓存策略?

缓存策略这东西,说白了就是决定什么数据该缓存、缓存多久、以及什么时候让它失效。Redis的灵活性让它能应对各种场景,从细粒度到粗粒度,都能玩得转。

1. 细粒度缓存:对象与数据片段 比如说,一个用户的信息、一篇博客文章的内容,或者某个商品的详情。这些数据通常从数据库查出来后,可以完整地存入Redis。

  • 用户资料缓存: 当用户登录或查看个人中心时,把用户的完整资料(比如ID、姓名、邮箱、头像URL等)以JSON字符串的形式存入Redis,键名可以设计成
    user:{user_id}:profile
    // 从数据库获取用户数据
    $user = getUserFromDatabase($userId);
    if ($user) {
        $redis->setex("user:{$userId}:profile", 3600, json_encode($user)); // 缓存1小时
    }

    这样下次再访问这个用户资料时,直接从Redis取,速度快得多。

  • 商品详情/文章内容: 类似用户资料,可以缓存商品的库存、价格、描述,或者文章的标题、正文、作者信息等。

2. 中等粒度缓存:查询结果缓存 对于一些查询条件复杂,但结果集相对稳定的数据库查询,可以把整个查询结果缓存起来。 比如,某个商品分类下的热门商品列表,或者某个时间段内的订单统计数据。

$cacheKey = 'hot_products_category:' . $categoryId;
$hotProducts = $redis->get($cacheKey);

if (!$hotProducts) {
    // 缓存未命中,从数据库查询
    $hotProducts = getHotProductsFromDatabase($categoryId);
    // 缓存结果,并设置过期时间,比如10分钟
    $redis->setex($cacheKey, 600, json_encode($hotProducts));
} else {
    $hotProducts = json_decode($hotProducts, true);
}
// 使用 $hotProducts

这种方式能显著减轻数据库压力,特别是对于高并发的查询。

3. 粗粒度缓存:页面或页面片段缓存 对于那些内容变化不频繁,但访问量又特别大的页面,可以直接缓存整个HTML内容或者页面的某个区域。

  • 整页缓存: 比如首页、新闻列表页等,在第一次访问时生成HTML,然后存入Redis。后续访问直接从Redis读取并返回。
  • 页面片段缓存: 比如一个网站的侧边栏、导航菜单、底部信息等,这些内容在不同页面中可能是一样的,可以单独缓存。
    // 假设这是一个获取导航菜单的函数
    function getNavigationMenu($redis) {
        $menuHtml = $redis->get('global:navigation_menu');
        if (!$menuHtml) {
            // 从模板或数据库生成HTML
            $menuHtml = renderNavigationMenu();
            $redis->setex('global:navigation_menu', 3600, $menuHtml);
        }
        return $menuHtml;
    }

    缓存策略的核心是“命中率”和“失效机制”。命中率越高,说明缓存效果越好。而失效机制则保证了数据的“新鲜度”。除了设置过期时间(TTL),有时候还需要手动删除缓存(比如商品价格变了,就得立刻删除对应商品的缓存),或者使用更高级的Tag(标签)缓存,给多个相关的缓存项打上同一个标签,然后通过标签批量删除。

使用Predis时常见的性能考量与最佳实践

用Predis操作Redis,想发挥出它的最大性能,有些地方是需要特别留意的。我个人觉得,很多时候性能问题并不是Redis本身慢,而是我们用错了姿势。

1. 善用管道(Pipelining) 如果你需要一次性执行多条Redis命令,比如给多个用户设置缓存,或者从多个键读取数据,一条条地发送命令效率会很低。因为每次命令发送和接收都需要网络往返时间(RTT)。Predis支持管道操作,可以把多条命令打包一次性发送给Redis,Redis处理完后,再把所有结果一次性返回。这能大幅减少网络延迟带来的开销。

// 不使用管道,多次网络往返
// $redis->set('key1', 'value1');
// $redis->set('key2', 'value2');

// 使用管道,一次网络往返
$responses = $redis->pipeline(function ($pipe) {
    $pipe->set('key1', 'value1');
    $pipe->set('key2', 'value2');
    $pipe->get('key1');
    $pipe->incr('counter');
});

// $responses 是一个数组,包含了所有命令的执行结果
// print_r($responses);

这玩意儿,在高并发场景下,简直是性能优化的利器。

2. 键名设计与内存管理

  • 键名规范: 好的键名设计不仅方便管理,也能提高可读性。通常采用
    对象:ID:属性
    的格式,例如
    user:123:profile
    product:456:price
    。避免过长或过于复杂的键名,因为键名本身也会占用内存。
  • 过期策略: 大部分缓存数据都应该设置过期时间(TTL),避免数据无限增长导致内存溢出。Redis有多种过期策略(如LRU、LFU),但手动设置TTL是最直接有效的。
  • 大键问题: 避免存储过大的字符串、列表、哈希等。一个键对应的数据量太大,在网络传输和Redis内部处理时都会成为瓶颈。如果确实需要存储大量数据,考虑拆分成多个小键,或者使用Redis的哈希(Hash)数据结构来存储对象,比每个字段一个键要节省内存。

3. 数据序列化与反序列化 PHP中的数组或对象不能直接存入Redis,需要先序列化成字符串。常用的有

json_encode/json_decode
和PHP自带的
serialize/unserialize

  • json_encode
    :跨语言兼容性好,可读性强,但性能略低于
    serialize
    ,且对某些PHP对象(如包含闭包)无法直接序列化。
  • serialize
    :PHP原生,性能通常更好,可以序列化几乎所有PHP数据类型,但生成的字符串可读性差,且不跨语言。 选择哪个取决于你的具体需求。我个人倾向于
    json_encode
    ,因为现代应用很多时候都需要数据在不同服务、不同语言间流转,JSON的通用性更胜一筹。

4. 错误处理与降级 缓存系统不是核心业务的唯一数据源,它只是提升性能的手段。所以,当Redis服务不可用或连接出现问题时,你的应用不能直接崩溃。

  • 使用
    try-catch
    捕获Predis的连接异常和运行时异常。
  • 在捕获到异常时,应该有相应的降级策略:例如,直接从数据库读取数据,或者返回一个默认值。同时,记录日志,以便及时发现并解决Redis的问题。
try {
    $redis = new Client(['host' => '127.0.0.1', 'port' => 6379]);
    $data = $redis->get('some_data');
    if ($data === null) {
        // 缓存未命中
        $data = getDataFromDatabase();
        $redis->setex('some_data', 300, $data);
    }
    // 使用 $data
} catch (Predis\Connection\ConnectionException $e) {
    // Redis连接失败,降级到数据库
    error_log("Redis connection failed: " . $e->getMessage());
    $data = getDataFromDatabase();
    // 使用 $data
} catch (Exception $e) {
    // 其他Predis操作错误
    error_log("Redis operation failed: " . $e->getMessage());
    $data = getDataFromDatabase();
    // 使用 $data
}

通过这些实践,你可以让PHP应用更好地利用Redis缓存,同时避免一些常见的性能陷阱。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2914

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1737

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1568

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1120

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1566

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1297

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1669

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1310

2023.11.13

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

1

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号