面试题答案
一键面试Redis常用的数据淘汰策略
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。此策略不会淘汰任何数据,适用于不希望丢失数据的场景,但可能导致写入失败。
- volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。如果数据都没有设置过期时间,此策略等同于noeviction。
- volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选即将过期的数据淘汰。
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中随机挑选数据淘汰。
- allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰。如果数据没有设置过期时间,也会被淘汰。
- allkeys-random:从所有数据集中随机挑选数据淘汰。
在缓存一致性场景下较合适的策略及原因
- volatile-lru:
- 原因:在缓存一致性场景下,通常希望优先淘汰那些长时间未被访问且设置了过期时间的数据。因为这些数据可能已经不再频繁使用,淘汰它们可以为新的数据腾出空间,同时减少缓存与后端数据源不一致的风险。如果采用allkeys-lru,可能会淘汰掉那些未设置过期时间但仍在使用的重要数据,影响系统性能。而volatile-ttl虽然优先淘汰即将过期的数据,但不一定是最近最少使用的,可能导致仍在频繁使用的数据被提前淘汰。volatile-random则过于随机,不能有效利用数据的访问频率信息。
- allkeys-lru:
- 原因:当所有数据都可能成为缓存一致性维护的对象时,allkeys-lru通过淘汰最近最少使用的数据,可以在整体上保证缓存中有更多活跃的数据。相比volatile-lru,它不需要依赖数据设置过期时间,适用于所有数据都有可能因为后端数据源更新而需要保持一致性的场景。不过在使用时需谨慎评估,避免淘汰重要数据。