面试题答案
一键面试惰性删除和定期删除策略结合方式
- 惰性删除:在每次从Redis读取数据时,检查该数据是否已过期。如果过期,则删除该数据并返回空值。这样可以避免在数据过期后仍然占用内存空间,同时也不会在数据过期时立即消耗额外的系统资源去删除它,减少对系统性能的影响。例如,在使用
GET
命令获取数据时,Redis内部逻辑会先检查数据是否过期,如果过期则执行删除操作并返回nil
。 - 定期删除:Redis会定期随机抽取一些设置了过期时间的键进行检查,删除其中过期的键。通过这种方式,即使某个键长时间未被读取(即不会触发惰性删除),也有机会被删除,防止过期数据长时间占用内存。Redis通过配置文件中的
hz
参数来控制定期删除执行的频率,hz
值越大,定期删除执行越频繁,清理过期数据越及时,但也会增加CPU的负载。
确保数据一致性和系统性能
- 数据一致性:惰性删除保证了每次读取数据时,获取到的都是未过期的有效数据,从读取操作角度维护了数据一致性。定期删除则在后台清理过期数据,防止过期数据长时间残留,进一步保证整体数据的一致性。例如,对于一个缓存用户登录信息的场景,用户登录后信息存入Redis并设置过期时间,下次用户请求时通过惰性删除保证获取到的是有效登录信息,定期删除保证过期的登录信息不会一直占用内存影响其他数据的一致性。
- 系统性能:惰性删除只有在数据被访问时才进行删除操作,不会对系统正常运行造成额外的删除开销,减少了不必要的性能损耗。定期删除通过随机抽样的方式,每次只检查少量的键,并且频率可以通过
hz
参数调整,避免了一次性检查大量键导致的CPU压力过大,从而在清理过期数据和系统性能之间取得平衡。比如在高并发读写的系统中,惰性删除不会因为数据过期而打断正常的读写流程,定期删除合理设置频率也不会过度消耗CPU资源,保障了系统整体性能。
可能遇到的问题及解决方案
- 内存占用问题:虽然惰性删除和定期删除策略结合能清理过期数据,但如果过期数据量非常大,且分布不均匀,可能会导致部分过期数据长时间未被清理,占用大量内存。
- 解决方案:可以适当增加定期删除的频率(调大
hz
值),但要注意监控CPU使用率,防止因CPU占用过高影响系统性能。另外,可以考虑使用Redis的内存淘汰策略,当内存使用达到一定阈值时,Redis会根据设定的淘汰策略主动删除一些数据,如volatile - lru
(在设置了过期时间的键中,使用LRU算法淘汰最近最少使用的键)、allkeys - lru
(在所有键中,使用LRU算法淘汰最近最少使用的键)等,确保内存使用在合理范围内。
- 解决方案:可以适当增加定期删除的频率(调大
- CPU负载问题:增加定期删除频率可能会导致CPU负载升高,影响系统其他业务的正常运行。
- 解决方案:根据系统的实际情况,通过监控CPU使用率等指标,动态调整
hz
值,找到一个合适的平衡点,既能有效清理过期数据,又不会使CPU负载过高。另外,可以考虑在系统负载较低的时间段,如凌晨等时段,适当提高定期删除的频率,在不影响业务高峰期性能的前提下,更好地清理过期数据。
- 解决方案:根据系统的实际情况,通过监控CPU使用率等指标,动态调整
- 数据不一致问题:在极端情况下,如某个键在定期删除周期内过期,且一直未被惰性删除访问到,可能会存在短暂的数据不一致(读取到过期数据)。
- 解决方案:对于对数据一致性要求极高的场景,可以在业务层面进行额外的处理。例如,在写入数据时记录数据的过期时间,在读取数据时,除了依赖Redis的过期检查,还可以自行对比记录的过期时间,确保获取到的数据未过期。虽然这种方式增加了业务复杂度,但能进一步提高数据一致性。