面试题答案
一键面试过期键检查时机
- 惰性删除:
- 当客户端访问一个键时,Redis会先检查该键是否过期。如果过期,会删除该键,并返回相应的空值(例如,对于GET操作返回nil)。这种方式只有在实际访问键时才进行过期检查,减少了CPU的额外开销。
- 定期删除:
- Redis会周期性地随机从数据库的expires字典中取出一定数量的键检查是否过期,并删除过期键。
- 这个周期是由Redis的配置参数
hz
控制,hz
表示每秒执行serverCron函数的次数,默认值为10,即每秒执行10次。每次执行serverCron函数时,会随机检查一些键的过期情况。 - 每次检查的键数量不是固定的,Redis会根据当前数据库中键的数量等因素动态调整每次检查的键数,以平衡CPU开销和内存释放。
过期后对内存和数据访问的影响
- 内存影响:
- 一旦键过期并被删除(无论是惰性删除还是定期删除),该键所占用的内存就会被释放,从而使得Redis占用的内存减少。这有助于控制Redis的内存使用量,避免因大量过期键占用内存而导致内存溢出等问题。
- 数据访问影响:
- 对于已过期且被删除的键,后续对该键的任何读或写操作都会返回空值或失败(例如,GET操作返回nil,SET操作正常执行但实际上是在创建新键)。这是因为过期键已不存在于数据库中,就如同该键从未存在过一样。客户端在进行数据访问时,不会感知到该键曾经存在且已过期,只知道当前键不存在。