面试题答案
一键面试Redis对象内存回收自动化基本原理
Redis通过引用计数和垃圾回收机制实现对象内存回收自动化。当一个对象被创建时,它会有一个引用计数,记录有多少个地方引用了该对象。当一个对象的引用计数变为0时,意味着没有任何地方再使用这个对象,Redis就会将其内存释放。
涉及的主要机制
- 引用计数:每个Redis对象都有一个refcount字段记录引用次数。当新的引用指向该对象时,refcount加1;当一个引用不再指向该对象时,refcount减1 。当refcount为0时,对象占用的内存被释放。例如,当一个键值对被删除时,对应的值对象的引用计数会减1,如果减1后变为0,就会回收该值对象的内存。
- 惰性删除:惰性删除是指当客户端尝试访问一个已经过期的键时,Redis并不会立即删除该键值对,而是检查键是否过期,如果过期则删除该键值对,并返回相应结果。这样避免了在键过期时立即执行删除操作带来的性能开销,只有在访问时才进行处理。
- 定期删除:Redis会定期(默认每秒10次)随机抽取一些设置了过期时间的键进行检查,删除其中过期的键。通过这种定期的、随机的方式,在一定程度上保证了过期键不会长期占用内存,同时又不会因为频繁检查所有过期键而影响性能。
- 内存淘汰策略:当Redis内存使用达到maxmemory限制时,会根据设置的内存淘汰策略选择某些键值对进行删除,以释放内存空间。常见的淘汰策略如volatile-lru(在设置了过期时间的键中,使用最近最少使用算法淘汰键)、allkeys-lru(对所有键使用最近最少使用算法淘汰键)等 。