面试题答案
一键面试定时过期
- 工作方式:在设置缓存数据时,同时设置一个过期时间。当到达过期时间后,该缓存数据会被自动删除。例如,在使用Redis设置缓存时,可以通过
SET key value EX seconds
命令,其中EX seconds
就是设置的过期时间(秒),当seconds
时间过去后,key
对应的缓存数据就会被删除。 - 对缓存命中率影响:从理论上来说,如果数据的访问模式比较规律,且过期时间设置合理,能及时淘汰不再使用的数据,有助于保持缓存空间的有效利用,不会因为大量过期数据占用空间而影响新数据的缓存,从而维持较高的缓存命中率。但如果过期时间设置过短,可能导致经常需要从数据源重新获取数据,降低缓存命中率;若设置过长,则可能长时间保留不再使用的数据,浪费缓存空间,影响其他更常用数据的缓存,也可能间接降低缓存命中率。
惰性过期
- 工作方式:数据在设置时同样可以设置过期时间,但并不会主动去检查数据是否过期,而是在每次获取缓存数据时,才检查该数据是否过期。如果过期,则删除该数据,并返回空值(表示缓存未命中),然后从数据源获取最新数据并重新放入缓存。比如在一个简单的Python字典模拟的缓存中,每次获取
cache[key]
时,先检查当前时间是否超过了设置的过期时间expire_time[key]
,如果超过则删除该键值对,否则返回对应的值。 - 对缓存命中率影响:优点是只有在数据被访问时才判断是否过期,不会因为频繁检查过期而消耗过多资源。对于访问频率较低的数据,即使已过期也不会立刻被清理,在再次访问前仍然占用缓存空间,可能降低缓存命中率。但对于访问频繁的数据,只要不过期就一直命中,缓存命中率可能较高。整体而言,可能会因为部分过期数据长时间占用缓存空间,导致缓存中无法缓存新的更常用数据,在一定程度上影响缓存命中率。
定期过期
- 工作方式:系统每隔一段时间(比如每隔100毫秒),就随机从缓存中取出一定数量(比如100个)的缓存数据进行检查,删除其中过期的数据。例如,在一个简单的缓存系统实现中,可以通过一个定时任务,按照设定的时间间隔,从缓存数据集合中随机抽取部分数据,检查其过期时间,将过期的数据删除。
- 对缓存命中率影响:定期过期是在定时过期和惰性过期之间的一种折中策略。合理设置检查周期和每次检查的数据量,可以在不消耗过多资源的情况下,及时清理部分过期数据,减少过期数据占用缓存空间的时间,从而提高缓存命中率。但如果检查周期过长或者每次检查的数据量过少,可能导致大量过期数据长时间存在,影响缓存命中率;反之,如果检查过于频繁或者每次检查数据量过大,会增加系统开销,也可能对缓存命中率产生一定影响,因为在检查过期数据时可能影响正常的缓存访问操作。