最准确的Redis延迟测试方法是在php artisan tinker中手动执行读写并微秒计时,绕过HTTP层、禁用OPcache、显式调用Cache::store('redis')、清空缓存并验证连接。

直接在 php artisan tinker 里测,别走 Web 请求、别用 remember()、别混用驱动——否则你测的根本不是 Redis 读写延迟,而是框架启动+中间件+模型绑定的总耗时。
用 tinker 手动控制读写并计时
这是最干净、可复现的测法。所有操作都在 CLI 环境下,绕过 HTTP 层干扰,且能精确到微秒级。
- 先确保
CACHE_DRIVER=redis已生效,并运行php artisan config:clear - 进入
php artisan tinker,执行以下代码(注意替换键名和值大小):
php
// 写入 100 次,每次存 256 字节字符串
$start = microtime(true);
for ($i = 0; $i < 100; $i++) {
Cache::store('redis')->put("test_key_{$i}", str_repeat('x', 256), 3600);
}
echo "write 100×256B: " . (microtime(true) - $start) . "s\n";
<p>// 读取 100 次(确保已存在)
$start = microtime(true);
for ($i = 0; $i < 100; $i++) {
Cache::store('redis')->get("test<em>key</em>{$i}");
}
echo "read 100×256B: " . (microtime(true) - $start) . "s\n";</p>- 结果单位是秒,除以 100 就是单次平均耗时(通常 Redis 单次
- 避免用超大值(如 1MB 字符串),
serialize()和网络包限制会让延迟失真
确认你真的在连 Redis,不是 fallback 到 file
常见错误是 .env 没改对,或缓存配置没刷新,导致你以为在测 Redis,实际走的是文件缓存。
- 检查
.env:必须有CACHE_DRIVER=redis,且没有拼写错误(比如写成redsi) - 验证连接是否成功:
Cache::store('redis')->put('conn_test', 'ok', 5)返回true才算通 - 如果返回
false或抛出ConnectionException,说明 Redis 服务未运行、密码错、端口不通,或config/cache.php中connection名称不匹配 - 别依赖默认 store,始终显式调用
Cache::store('redis'),防止被default配置误导
排除 PHP 序列化和 OPcache 干扰
Redis 驱动默认用 PHP serialize(),这对小数据影响不大,但一旦值变大(比如 Eloquent 模型),序列化/反序列化开销会吃掉大量时间,让你误以为是网络或 Redis 本身慢。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
立即学习“PHP免费学习笔记(深入)”;
- 临时禁用 OPcache CLI 缓存(防止脚本加载抖动):启动 tinker 前加环境变量
OPCACHE_ENABLE_CLI=0 php artisan tinker - 想测纯网络+存储层延迟?改用
raw()接口跳过序列化:Cache::store('redis')->raw()->set('raw_key', 'hello', ['EX' => 3600]) -
raw()返回的是 Redis 原生命令响应(如"OK"),不能直接传数组或对象;只适合字符串/数字场景 - 若必须缓存模型,考虑改用
igbinary序列化(需 PHP 扩展支持),它比原生serialize()快且省内存
对比测试时务必清空各自缓存
别让上一轮文件缓存的结果污染 Redis 测试,也别让 Redis 的旧键影响文件缓存基准线。
- 测 Redis 前:进 tinker 执行
Redis::flushdb()(注意是Redis::,不是Cache::) - 测 file 前:终端执行
rm -rf storage/framework/cache/data/* - 两次测试之间要
php artisan config:clear,否则驱动配置可能被缓存住 - 不要在同一次 tinker 会话里交替测两种驱动——CLI 环境变量和连接池状态可能残留
真正影响延迟的,往往不是 Redis 本身,而是你有没有把 serialize()、OPcache、环境变量、驱动 fallback 这些“透明层”全关掉。测之前多敲两行验证命令,比跑完再怀疑数据更省时间。


















