利用Redis的过期时间(EXPIRE命令)最简单的方式就是设置key的TTL,当TTL到0时自动删除key。这在缓存场景中超级实用,比如用户登录token,设置1小时过期,过期自动清理,避免内存爆炸。新进度:结合Lua脚本实现原子性过期检查和续期,代码如下: redis.call('EXPIRE', KEYS[1], ARGV[1]) if redis.call('TTL', KEYS[1]) == -1 then return 1 end return 0
场景一:验证码缓存
发送短信验证码,用redis.setex(phone, 300, code),5分钟自动过期,用户多次请求时检查TTL,不用手动删,省心。实际测试,高并发下Redis过期机制稳定,不会丢数据。
场景二:分布式锁
用SETNX加EXPIRE实现锁,锁自动过期防止死锁。新分享:用Redlock算法多节点,过期时间随机化30-60s,避免脑裂。最近项目用上,稳定性up up。
场景三:热点数据限流
INCR key,EXPIRE 60,计数1分钟内请求次数超100就拒。简单粗暴,防刷接口。新技巧:用ZSET记录时间窗口滑动过期,精度更高,代码:ZADD key score member,ZREMRANGEBYSCORE清理。
场景四:购物车临时数据
匿名用户购物车用临时key,EXPIRE 1天,登录合并正式key。过期自动清内存,节省空间。进度:加事件通知,key过期时发消息异步处理。
场景五:任务队列延迟执行
用Sorted Set ZADD score key,score是过期时间戳,定时任务scan过期score执行并del。比RabbitMQ轻量,新优化:用Redis 6.0 Stream + consumer group,更可靠。
FAQ
Q: Redis过期key会不会立即删除?
A: 不是,懒删除+定时采样,可能延迟几秒。
Q: 高并发下EXPIRE准确吗?
A: 单机准,多主复制有小延迟,用集群注意。
Q: 怎么续期不删key?
A: TTL>0就EXPIRE覆盖。
Q: 内存不足时过期优先?
A: 配置maxmemory-policy allkeys-lru,过期key优先淘汰。