php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】
技术百科
看不見的法師
发布时间:2026-01-01
浏览: 次 Redis扩展必须安装并启用才能使用new Redis(),否则报Class 'Redis' not found;predis是纯PHP客户端但性能较差;set/get默认序列化导致null值歧义;pipeline提升吞吐量,multi保证简单事务,复杂场景需Lua或应用层锁。
Redis 扩展是否已安装并启用
PHP 操作 Redis 前,必须确认 redis 扩展已编译进 PHP 或通过 extension=redis.so(Linux/macOS)或 extension=php_redis.dll(Windows)启用。仅装了 phpredis 包但没启用扩展,调用 new Redis() 会直接报错 Class 'Redis' not found。
验证方式很简单:
php -m | grep redis
或者在 Web 环境中运行:
- 返回
true才能继续;返回false就得先配扩展,不是装composer require predis/predis就能替代的 -
predis是纯 PHP 客户端,不依赖扩展,但性能和连接复用能力弱于原生redis扩展 - PHP 8.0+ 用户注意:旧版
phpredis(5.3.7+ 版本
new Redis() 连接时的超时与重试控制
默认 new Redis() 不带参数时不会自动连接,首次调用命令(如 set)才触发连接,且默认超时是 0(无限等待),线上环境极易卡死。必须显式调用 connect() 并设好超时。
-
connect($host, $port, $timeout, $retry_interval, $read_timeout)中,$timeout是连接建立超时(秒),$read_timeout是读响应超时(秒),两者都应设为1.0或更小 -
$retry_interval在连接失败后重试前等待毫秒数,设为100可避免密集轮询 - 不要用
pconnect()在 CLI 脚本里——它不会真正复用连接,反而可能残留 socket 导致Too many open files
connect('127.0.0.1', 6379, 1.0, 100, 1.0);
} catch (RedisException $e)
{
// 注意:RedisException 不是 RuntimeException,需单独捕获
error_log('Redis connect failed: ' . $e->getMessage());
exit(1);
}
?>
set / get 的序列化行为与 null 值陷阱
set() 默认对非字符串值做 serialize(),get() 会自动 unserialize()。这看似方便,实则埋下隐患:
- 存
null时,get()返回false(不是null),且无法区分“键不存在”和“存了 null” - 开启
redis.serializer = php(php.ini)会影响所有实例,不推荐;应在代码里统一用setex()+json_encode()控制格式 - 如果只存字符串,显式转成字符串再 set,避免意外序列化:
$redis->set('key', (string)$value)
set('user:id:123', json_encode(['name' => 'Alice', 'age' => 30]));
$data = json_decode($redis->get('user:id:123'), true);
// 比直接 set(array) + get() 更可控、无反序列化风险
?>
pipeline 和 multi 的适用边界
批量操作别盲目上 multi(Redis::PIPELINE)。它只是把命令攒起来发一次,不保证原子性;而 multi(Redis::MULTI) 才是事务,但 Redis 的事务不支持回滚,出错只报错不中断。
- 纯粹提升吞吐量(比如批量写日志)、无需一致性校验 → 用
pipeline - 需要多个 key 同时成功/失败(如扣库存+写订单),且逻辑简单 → 用
multi+exec,但得自己检查exec返回值是否全为非null -
watch()配合multi可实现乐观锁,但 watch 的 key 被改就会使exec返回false,这点常被忽略
真正难处理的是跨库、跨实例、含条件判断的复合操作——这时候就得退回到应用层加锁或用 Lua 脚本,而不是硬塞进 pipeline。
# ai
# 的是
# 就能
# windows
# 就得
# 客户端
# 复用
# 设为
# mac
# redis
# win
# linux
# js
# json
# macos
# String
# class
# 序列化
# 报错
# require
# 重试
# NULL
# php
# composer
# 应用层
# lua
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10如何更改用户账户控制_Windows10
- Win11怎么设置默认PDF阅读器 Win11修改
- Win10如何优化内存使用_Win10内存优化技巧
- 如何在Golang中实现邮件发送功能_Golang
- Windows电脑如何进入安全模式?(多种按键方法
- Linux怎么查找死循环进程_Linux系统负载分
- Windows如何查看和管理已安装的字体?(字体文
- Win11文件扩展名怎么显示_Win11查看文件后
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- 如何使用Golang处理静态文件缓存_提高页面加载
- php打包exe如何加密代码_防反编译保护方法【技
- Win11怎么关闭系统透明度_Windows11个
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Python实现图数据库操作_Neo4j核心CRU
- php中::能访问全局变量吗_全局作用域与类作用域
- Python性能剖析高级教程_cProfileLi
- Windows10如何删除Windows.old_
- Win11怎么查看已连接wifi密码 Win11查
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Win10怎样卸载TeamViewer_Win10
- 一文教你快速开通网站LOGO图
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- Win10系统字体模糊怎么办_Windows10高
- C++如何使用std::transform批量处理
- 如何在 Django 中修改用户密码后保持会话不丢
- Windows10系统怎么查看CPU温度_Win1
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- Linux怎么禁止Root用户远程登录_Linux
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Win11怎么更改账户头像_Windows 11自
- Win11怎么激活Windows10_Win11激
- Win11怎么设置触控板手势_Windows11三
- 如何在Golang中处理二进制数据_Golang
- c++怎么使用std::tuple存储多元组数据_
- Windows10系统怎么查看CPU核心数_Win
- 如何使用Golang实现容器安全扫描_Golang
- php8.4新语法match怎么用_php8.4m
- c++中explicit(bool)的用法 c++
- Win11怎么设置屏保时间_调整Win11屏幕保护
- 如何在Golang中解压文件_Golang com
- Python网页解析流程_html结构说明【指导】
- PowerShell怎么创建复杂的XML结构
- 如何将竖排文本文件转换为横排字符串
- 用lighttpd能运行php吗_lighttpd
- 如何使用Golang实现文件追加操作_向已有文件追
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- How to Properly Use NumPy

{
// 注意:RedisException 不是 RuntimeException,需单独捕获
error_log('Redis connect failed: ' . $e->getMessage());
exit(1);
}
?>
QQ客服