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 内部服务的,比如内部传参。所以看起来对外服务用处十分鸡肋