cache::dec()仅redis/memcached驱动支持原子自减,file驱动静默失败;需确保键存在且为数值、驱动已正确配置,调用后应检查返回值验证是否生效。

ThinkPHP 5 的 Cache::dec() 用于对**数值型缓存项执行原子自减操作**,但它的可用性高度依赖缓存驱动类型——仅 Redis 和 Memcached 等支持原子命令的驱动才真正生效;File 驱动会静默失败(不报错,也不改变值)。
基本用法和参数说明
Cache::dec('key') 默认步进值为 1;Cache::dec('key', $step) 可指定任意整数步进值(支持负数,等效于自增)。操作前无需预先设置该 key,首次调用时若 key 不存在,会按 0 处理再减去步进值。
-
Cache::dec('visit_count');→ 相当于visit_count = (当前值 ?? 0) - 1 -
Cache::dec('score', 5);→ 当前值减 5 -
Cache::dec('counter', -2);→ 实际效果等同于Cache::inc('counter', 2)
必须满足的前提条件
自减操作不是“写入后读取再改”,而是底层驱动的原子指令。因此:
- 缓存驱动必须是 Redis 或 Memcached(File、Sqlite、Xcache 等均不支持,调用后无效果且不提示)
- 对应 key 必须已存在且值为合法数字(字符串形式的数字如
"123"通常可被自动转换) - 确保
config/cache.php正确配置了 Redis/Memcached,并已完成初始化(未配置时Cache::dec()会抛出异常或返回 false)
配合标签和错误处理建议
若缓存带标签(如 Cache::tag('user')->set('balance', 100)),dec() 仍可正常使用,但需注意:标签本身不影响 dec 行为,只影响后续清除范围。
- 推荐在调用后检查返回值:
$newVal = Cache::dec('stock'); if ($newVal === false) { /* 驱动不支持或 key 无效 */ } - 避免对非数值缓存使用 dec —— 比如缓存的是 JSON 字符串或数组,dec 会失败
- 生产环境慎用
Cache::clear()清 Redis 全库,它会连带清掉所有 dec 累积的数据
常见误用与验证方式
开发中容易误以为 File 缓存也能自减。验证是否生效最直接的方法是:
- 先
Cache::set('test_num', 10, 3600) - 再
Cache::dec('test_num', 3) - 最后
var_dump(Cache::get('test_num'));—— 若输出7,说明成功;若仍是10或null,大概率是驱动不匹配或未初始化
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











