面试题答案
一键面试触发内存回收操作的情况
- 达到maxmemory限制:当Redis使用的内存达到
maxmemory
配置项所设定的内存上限时,就会触发内存回收。Redis提供了多种内存淘汰策略(如noeviction
、volatile-lru
、allkeys-lru
、volatile-random
、allkeys-random
、volatile-ttl
等),根据不同策略决定淘汰哪些数据来释放内存。 - 过期键清理:Redis会定期主动检查过期的键,默认每秒进行10次过期扫描(可通过
hz
配置项调整频率)。在扫描过程中,会删除那些已经过期的键值对,从而释放内存。此外,当客户端访问一个过期的键时,也会触发对该过期键的删除操作,回收内存。
对Redis性能的影响
- 达到maxmemory限制时:
- noeviction策略:如果采用该策略,当内存达到上限后,再进行写操作会返回错误,读操作不受影响。这种情况下,虽然不会因为数据淘汰而产生额外开销,但业务的写操作会失败,影响业务的正常运行。
- LRU和Random策略:无论是
volatile-lru
、allkeys-lru
还是volatile-random
、allkeys-random
策略,在触发内存回收时,都需要遍历数据来选择要淘汰的键值对。LRU策略相对更复杂,需要维护键的访问时间信息,这在一定程度上会增加CPU的开销。大量的淘汰操作可能导致CPU使用率升高,从而影响Redis处理其他请求的性能,例如响应时间变长,吞吐量下降。 - volatile-ttl策略:此策略淘汰的是设置了过期时间且剩余存活时间较短的键。同样需要遍历数据,不过相比LRU策略,它不需要额外维护访问时间信息,开销相对较小,但仍可能因为遍历操作增加CPU负担,对性能产生一定影响。
- 过期键清理时:
- 定期主动扫描:每秒10次的过期扫描频率如果设置过高,会占用较多的CPU资源,影响Redis处理其他请求的性能。但如果频率过低,过期键不能及时清理,可能导致内存长时间占用过高。
- 被动删除:客户端访问过期键触发的删除操作,一般情况下对性能影响较小,因为这是按需进行的操作,不会像定期扫描那样集中消耗资源。但如果大量过期键集中被访问,也可能在短时间内增加CPU开销,影响性能。