一.过期Key处理
过期Key处理
通过expire命令 给key设置TTL,当key过期后会被自动清除,释放内存
Redis每个库的数据都存储在redisDB中,该结构体包含两张哈希表
Dict: 存储Redis中所有的键值数据
Expires: 不存储value,而是key-到期时间(写入时间+TTL)
设置了过期时间的key会在Expires中再储存一份,判断其是否过期,只需要查询 Expires中对应key的过期时间与当前时间进行对比
*过期key删除策略 惰性删除 周期删除
惰性删除: 当访问到某个KEY时才检测其是否过期,过期则进行删除操作;缺陷:若一 直不访问则永远不会删除
周期删除: 通过一个定时任务 在expires中进行抽样 若过期则删除
slow模式: 默认每秒执行10次,每次删除操作不超过25ms
fast模式: 跟随Redis内部IO事件循环执行 两次任务执行时间间隔若低于2ms则忽 略,高于2ms执行
二.内存淘汰策略
内存淘汰策略
即便是有过期key删除机制,也无法保证过期的key会立马删除,内存仍然有被占满的风险;八种内存淘汰策略,每次处理客户端命令时都会对内存使用情况进行判断必要时进行淘汰
noeviction: 不淘汰任何key 当内存存满时 不再允许写入新数据 默认淘汰策略
volatile-ttl: 淘汰设置了ttl的key,优先淘汰剩余时间更短的key
*淘汰范围: volatile(设置了ttl的key) allkeys(全体key)
*淘汰策略: random(随机淘汰) LRU(最后一次访问时间) LFU(访问频率)
LRU: 最后一次访问距现在越久,淘汰优先级越高
LFU: 访问频率越低,淘汰优先级越高
*两种淘汰范围与三种淘汰策略组合得到六种淘汰方式 以及noeviction与volatile-ttl 共八种淘汰策略
内存淘汰策略
即便是有过期key删除机制,也无法保证过期的key会立马删除,内存仍然有被占满 的风险;种内存淘汰策略 每次处理客户端命令时都会对内存使用情况进行判断 必 要时进行淘汰
noeviction: 不淘汰任何key 当内存存满时 不再允许写入新数据 默认淘汰策略
volatile-ttl: 淘汰设置了ttl的key,优先淘汰剩余时间更短的key
*淘汰范围: volatile(设置了ttl的key) allkeys(全体key)
*淘汰策略: random(随机淘汰) LRU(最后一次访问时间) LFU(访问频率)
LRU: 最后一次访问距现在越久,淘汰优先级越高
LFU: 访问频率越低,淘汰优先级越高
*两种淘汰范围与三种淘汰策略组合得到六种淘汰方式 以及noeviction与volatile-ttl 共八种淘汰策略
最佳淘汰策略: LFU 优先淘汰访问频率低的key
Redis如何得知一个key的访问频率与最后访问时间?
Redis所有数据类型都会被封装在ReidsObject中
其中维护了一个lru变量 同时支持lru策略与lfu策略 记录访问频率与最后访问时间
Redis持久化时,对过期键的处理
RDB文件生成阶段: RDB文件生成时会对key进行检查,过期的key不会被保存到新 的RDB文件中。
RDB文件加载阶段: 主节点加载时同样会对key进行检查,过期的key不会被加载; 从服务器不检查,加载所有数据,但数据同步时会重新同步主节点的数据
AOF: 写入阶段,当过期键被删除时追加DEL命令;重写阶段: 对key进行检查,已 过期的key不会被被保存
*Redis主从模式,从节点不会主动改变自身保存的数据,即使是key过期了也不会主动清除,而是依靠主节点当key过期时在AOF文件中追加一条del语句,发送给从节点执行