Redis 的一个核心能力,是能给 key 设置过期时间。
SET session:user:1001 "token-abc"
EXPIRE session:user:1001 1800
TTL session:user:1001也可以一步写入并设置 TTL:
SET cache:product:1001 "{\"name\":\"键盘\"}" EX 300Redis 官方文档对 TTL 的返回值有两个非常重要的约定:
-2:key 不存在-1:key 存在,但没有过期时间
TTL cache:product:1001TTL 的工程意义非常大:
- Session 自动失效
- 验证码自动过期
- 缓存自动回收
- 锁自动释放
- 限流窗口自动滚动
#TTL 有几个非常容易忽略的细节
Redis 官方文档明确说明:
INCR、LPUSH、HSET这类“修改内容但不整体替换”的操作,不会清掉 TTLSET这种覆盖值的操作,成功时会丢掉之前的 TTL,除非你显式使用KEEPTTLPERSIST可以移除过期时间RENAME会把 TTL 一起带过去
这意味着:
SET user:1001:status "online"
EXPIRE user:1001:status 60
INCR article:88:views
SET user:1001:status "busy"类比一下:
TTL = 调度中心里的“自动清场倒计时”
不是所有改动都会重置它
只有某些“整体替换”动作会把旧倒计时打掉