为什么要处理数据过期
1.过期设置为程序逻辑的一部分,所以为了保证逻辑正确(不读取到过期数据),不得不对缓存做数据过期处理
2.过期数据,对业务来说已是无用数据,但是却仍然占有服务资源(主要是内存和磁盘),故处理过期数据,将其删除可以使服务资源得到释放
处理过期数据的常用策略
策略 | 说明 | 优点 | 缺点 |
---|---|---|---|
定时删除 | 根据键的过期时间设置定时器,触发超时及删除对应键 | 删除及时,内存友好 | 在内存不紧张,cpu紧张的情况下,cpu不友好 |
惰性删除 | 程序在取键时才对键进行过期检查 | cpu友好,只有在取键时才可能会触发删除当前键 | 内存不友好 |
定期删除 | 每隔一段时间执行一次限时限量的批量删除 | 相对中性,不像定时删除那样可能短时间占用大量cpu,也没有惰性删除浪费内存空间多 | - |
redis同时采用定期删除和惰性删除策略: 使用定期策略可以更平滑的利用cpu和内存资源,但是会存在过期数据失效不及时的问题。用惰性删除加以辅助便可达到定期删除下访问实时失效的效果
redis惰性删除
redis在客户端获取数据时,首先判断数据是否设置过期时间,如果设置了过期时间,且当前时间大于过期时间则删除对应的key
核心代码: db.c:expireIfNeeded函数中
//返回0未过期、大于0过期