上一篇
场景再现:凌晨3点,你被报警短信惊醒——PHP应用又双叒内存溢出了!😱 查日志发现是陈旧的Redis缓存堆积成山,手动执行flushdb
?太粗暴!写定时脚本?维护成本高!今天教你用Redis的「智能过期」+「懒惰删除」组合拳,让缓存像冰淇淋一样自动融化消失~ 🍦
传统PHP缓存管理有三大痛点:
setex
+del
的样板代码 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // 写入时直接绑定过期时间(单位:秒) $redis->setex('user:1001:profile', 3600, json_encode($userData));
👉 1小时后自动消失,适合短期缓存(如API限流令牌)⏳
在redis.conf
里激活智能淘汰机制:
maxmemory 2gb maxmemory-policy allkeys-lru # 内存不足时优先淘汰最近未使用的键
支持多种策略:
volatile-lru
:只淘汰设过TTL的键 allkeys-random
:随机淘汰 noeviction
:直接报错(默认策略,建议修改) 用Lua原子化操作实现「续期+清理」二合一:
$lua = <<<SCRIPT local key = KEYS[1] local new_ttl = ARGV[1] local new_value = ARGV[2] if redis.call("exists", key) == 0 then return redis.call("setex", key, new_ttl, new_value) else redis.call("expire", key, new_ttl) return "EXISTED" end SCRIPT; $redis->eval($lua, ['user:1001:profile', 7200, $updatedData], 1);
🌟 效果:访问时自动续期2小时,冷数据自然消亡
类型:ID:字段
结构(如product:789:stock
)方便批量管理 redis-cli info memory
查看内存碎片率 ttl = 3600 + rand(0, 300)
) 方案 | 内存占用 | QPS波动 | 代码复杂度 |
---|---|---|---|
纯PHP文件缓存 | 高📈 | 大🌊 | 低👍 |
Redis无TTL | 爆炸💥 | 平稳➖ | 中🤔 |
本文方案 | 稳定📉 | 极小⚡ | 高👑 |
EXPIRE
的NX/XX
选项,可防止意外覆盖过期时间 user:{1001}
) OBJECT idletime
命令能查看键的空闲时长,辅助优化TTL 本文由 廖吟怀 于2025-08-02发表在【云服务器提供商】,文中图片由(廖吟怀)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/514560.html
发表评论