cache::inc()仅支持redis/memcached驱动下的整数缓存原子自增,file驱动静默失败;须先set初始值,不返回新值需单独get,数据库字段自增应使用db::raw()。

ThinkPHP 5 的 Cache::inc() 用于对缓存中的数值型数据做原子自增,但它的行为和限制很关键——用错就等于没生效。
基础用法:只支持数值缓存
必须确保缓存值本身是整数或可转为整数的字符串(如 "123"),否则会静默失败或报错:
-
Cache::set('visit_count', 0, 3600);—— 先设一个初始值 -
Cache::inc('visit_count');—— 自增 1,结果变为 1 -
Cache::inc('visit_count', 5);—— 自增 5,结果变为 6
注意:Cache::inc() 不返回新值,需再调用 Cache::get() 获取结果。
驱动限制:File 驱动不支持,会静默失败
只有 Redis 和 Memcached 驱动真正支持原子自增操作:
- Redis 驱动:调用
INCR/INCRBY命令,安全高效 - Memcached 驱动:使用
increment方法,同样原子 - File 驱动:无对应机制,
inc()执行后不报错、也不修改缓存值,直接“假装成功”
检查当前驱动:打开 config/cache.php,确认 'type' => 'redis' 或 'memcache',而非 'file'。
常见踩坑点与应对
这些错误不会抛异常,但字段根本不变:
- 缓存键从未设置过(
Cache::get('xxx')返回null),inc()会失败 —— 务必先set()初始值 - 用
Cache::inc('key')后立刻查Cache::get('key'),却忘了它本就不返回新值 —— 要单独再 get 一次 - 在并发高频场景下依赖 File 缓存做计数 —— 改用 Redis,否则出现漏增、重复计数
- 误以为
inc()可用于字符串拼接或浮点运算 —— 它只接受整数步进,且只作用于整型缓存值
替代方案:Db::raw() 直接更新数据库字段
如果目标是数据库字段(比如用户积分、库存)自增,而不是缓存值,别混淆 Cache::inc() 和数据库操作:
- 用
Db::name('user')->where('id', 1)->inc('score')->update(); - 或更稳妥的原生表达式:
Db::name('user')->where('id', 1)->update(['score' => Db::raw('score + 10')]);
这个方式绕过模型层,不依赖主键、不依赖 save(),适合高并发扣减/累加场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











