0

0

Redis在PHP中怎么用_高并发缓存加速操作技巧【解答】

雪夜

雪夜

发布时间:2026-02-22 23:02:03

|

310人浏览过

|

来源于php中文网

原创

php redis高并发缓存核心是防穿透、击穿、雪崩:需空值缓存+布隆过滤、随机ttl防雪崩、setnx/lua原子写;优先phpredis扩展,连接须复用并设超时。

redis在php中怎么用_高并发缓存加速操作技巧【解答】

PHP 中用 Redis 做高并发缓存,核心不是“能不能连上”,而是“怎么避免缓存穿透、击穿、雪崩,以及如何让 setget 真正扛住瞬时流量”。直说结论:别裸用 redis->get() + redis->set(),必须加锁、设过期、分层兜底。

怎么连 Redis 才不掉坑(Predis vs phpredis)

PHP 有两个主流扩展:phpredis(C 扩展,性能高,推荐)和 Predis(纯 PHP,调试友好但慢 20%+)。线上高并发场景优先选 phpredis;若用 Docker 或共享主机没权限装扩展,才退到 Predis

常见错误是用 Predis\Client 每次 new 一个实例——它默认不复用连接,QPS 上千就卡在 TCP 握手。正确做法是单例或容器内复用:

$redis = new Predis\Client([
    'scheme' => 'tcp',
    'host'   => '127.0.0.1',
    'port'   => 6379,
    'timeout' => 0.5, // 必设!否则阻塞超久
    'read_write_timeout' => 0.3,
]);

phpredis 更简单,直接 new Redis() 后调 connect(),记得开 setOption(REDIS_OPT_PREFIX, 'myapp:') 避免 key 冲突。

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

缓存读写怎么防雪崩(key 失效时间 + 随机抖动)

所有热门 key 设相同过期时间(比如整点刷新),Redis 在那一秒集体失效,后端 DB 瞬间被打爆——这就是缓存雪崩。

解决办法不是“永不过期”,而是“主过期时间 + 随机偏移”:

  • $ttl = 3600 + rand(1, 300); // 基础 1 小时 + 0~5 分钟抖动
  • set($key, $value, ['ex' => $ttl])phpredis)或 setex($key, $ttl, $value)
  • 如果业务允许,对关键 key 加二级缓存(如 APCu 存 1 分钟),Redis 挂了也能撑几秒

注意:别用 expire($key, $ttl) 单独设过期——它和 set 不是原子操作,中间若崩溃,key 就永久存在了。

怎么避免缓存穿透(空值也缓存 + 布隆过滤器)

恶意请求查 user_id=999999999 这种根本不存在的 ID,Redis 查不到,穿透到 DB,DB 也查不到,还无法缓存结果——大量这类请求直接拖垮 DB。

剪刀手
剪刀手

全自动AI剪辑神器:日剪千条AI原创视频,零非原创风险,批量高效制作引爆流量!免费体验,轻松上手!

下载

最简方案:查不到时,把 null 或特殊标记(如 "__MISS__")以短 TTL(比如 60 秒)写入 Redis:

if ($data === false) {
    $redis->setex($key, 60, '__MISS__');
    return null;
}

更彻底的方案是加布隆过滤器(Bloom Filter):启动时把所有合法 ID 加入过滤器,请求先过滤再查缓存。可用 redisbloom 模块或 bitSet + bitOp 自建,但要注意误判率(通常设 1%)和扩容成本。

别漏掉:前端/网关层也要做参数校验,ID 格式不对(如字母混入)直接 400 拦截,不进缓存层。

并发写缓存怎么防覆盖(setnx + Lua 脚本原子更新)

两个请求同时发现缓存失效,都去查 DB,然后都执行 set($key, $data)——后写的覆盖前写的,可能把旧数据刷回去。

标准解法是 setnx(set if not exists)抢锁:

$lockKey = "lock:{$key}";
if ($redis->setnx($lockKey, 1)) {
    $redis->expire($lockKey, 10); // 锁 10 秒防死锁
    $data = $db->query(...); // 查库
    $redis->setex($key, 3600, json_encode($data));
    $redis->del($lockKey);
} else {
    // 等 100ms 后重试,或直接回源(看业务容忍度)
    usleep(100000);
    return $this->getCache($key);
}

但这个逻辑有竞态风险(比如 expire 失败)。更高阶做法是用 Lua 脚本保证原子性:

lua_script = "if redis.call('exists', KEYS[1]) == 0 then redis.call('setex', KEYS[1], ARGV[1], ARGV[2]); return 1 else return 0 end"
$redis->eval($lua_script, [$key, $ttl, $value], 1);

注意:Lua 脚本里不能调 DB,只能做缓存层原子操作;且脚本执行时间别超 50ms,否则阻塞其他命令。

真正难的不是连 Redis 或写 set,是设计缓存生命周期、应对节点故障时的降级策略、以及监控 redis-cli --latencyINFO commandstats 里的 cmdstat_get 耗时分布——这些细节,往往比语法多花三倍时间调优。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

826

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

826

2023.08.22

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

265

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

512

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

447

2024.04.08

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

21

2026.02.11

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

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

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