1. 过期时间是什么

  • 在redis 中是一个k-v 的失效时间点。设定由过期时间的key 在TTL 衰减到0时这个kv对会被redis回收

2. 为什么要过期时间

  • 如果不设置过期时间,且数据也不是什么常驻数据,那么当这个kv失效后仍驻留在内存里,如果不手动DEL 这个kv对就会一值占用内存资源,对于Redis 这种内存型数据库来说时一种资源浪费且废kv对也影响redis 数据的增删改查操作,所以过期时间有必要存在。

3. 怎么设置过期时间

  • EX (单位秒) - SET key value EX seconds:设置多少秒之后过期

  • PEX (单位毫秒)- SET key value PX milliseconds:设置多少毫秒之后过期

  • TTL key:查看还有多久过期

4. 键过期了多久删除

Redis 由三种过期kv回收策略:

  • 定时回收 : 给每个过期后的kv 挂个定时器,到了就回收,在大量kv 过期时会占用大量CPU资源

  • 定期回收: 定周期检查过期KV字典,看见有就回收 - 兜底策略

  • 惰性回收: 查询这个数据的时候发现过期了,回收 - 大量过期kv如果只是一次性使用,会导致大量废弃kv占用内存资源

目前Redis 默认采用定期 + 惰性 这以组合策略管理过期kv

偷个图

4.1 定期删除

如何查看默认周期是多长,周期频率是多久 ?

  • info

输出项 hz:xx 表示每秒执行的频率: 周期 = hz/1s

定期删除kv量是多少?

Redis 对于这个配置的定义是写死在代码里的 每周期删除20个过期kv对

#define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20 /* Loopkups per loop. */

redis 会一次周期里删除20个过期kv对,之后再次检查剩余过期kv对总数和总KV量的比率,若比率大于20%则继续在过期kv字典里检查再删20个直到过期kv/总kv <= 阈值 时才停止,这个阈值默认配置时5%(最新版)


5. 引用计数是什么?

  • 类似于编程语言中字符串对象常用的引用计数的套路,是COW/缓释评估编程思想的一种体现,本质是节省内存,当计数为0时意味着这个内存对象可以被回收.

6. Redis对象的引用计数

  • redis 初始化时会创建 0 - 9999 字符串

为什么时 0 - 9999 呢?

  • 0 - 9999 是常用数,复用概率大

  • 占用空间小

  • 0 - 9999 好比较,其他字符串需要组个字符遍历匹配

7. 引用计数验证

> SET num 100
> OBJECT REFCONNT num
> 2147483647 (uint32)

8. 引用计数这个字段就用在这?

  • 引用计数是为Redis 内部服务的,比如内部传参。所以看起来对外服务用处十分鸡肋