面试题答案
一键面试maxmemory
设置
maxmemory
应根据服务器实际可用内存来设置,一般建议预留一部分内存给操作系统及其他进程使用。例如,若服务器总内存为8GB,可设置 maxmemory
为6GB,即给操作系统等预留2GB左右。这样既能充分利用Redis处理高并发业务,又避免因Redis占用过多内存导致系统不稳定。
maxmemory - policy
设置优化性能及防止内存溢出
volatile - lru
:- 适用于业务场景中有较多设置了过期时间的键值对。当内存达到上限时,Redis会从设置了过期时间的键值对中,使用最近最少使用(LRU)算法淘汰部分键值对,以释放内存。例如在缓存业务场景中,缓存数据通常设置了过期时间,使用此策略可以优先淘汰长时间未被访问的缓存数据,保证新数据能正常写入,优化性能并防止内存溢出。
allkeys - lru
:- 适合业务中所有键值对都可被淘汰的场景。该策略会从所有键值对中,通过LRU算法淘汰部分键值对。比如在一个简单的计数器应用中,每个计数器可能没有设置过期时间,但数据量不断增长可能导致内存溢出,使用此策略可根据访问频率淘汰不常用的计数器,优化内存使用。
volatile - ttl
:- 适用于希望优先淘汰即将过期的键值对的场景。在内存达到上限时,Redis会优先淘汰剩余过期时间最短的设置了过期时间的键值对。例如在限时抢购活动的缓存场景中,活动结束后相关缓存数据应尽快释放,使用此策略能优先淘汰快过期的抢购缓存数据,保证内存空间。
allkeys - random
:- 随机从所有键值对中淘汰数据。这种策略不太适合对数据有严格访问要求的场景,但在一些对数据一致性和连续性要求不高,且希望快速释放内存的场景中可能有用,如某些临时数据存储场景,数据丢失对业务影响不大。
volatile - random
:- 随机从设置了过期时间的键值对中淘汰数据。适用于对数据淘汰顺序无特定要求,且只希望淘汰有过期时间键值对的场景,如部分缓存场景中,对缓存数据淘汰无严格规则,只要能释放内存即可。
noeviction
:- 此策略下,当内存达到上限时,Redis不再接受写请求,但读请求仍可正常处理。适用于对数据完整性要求极高,不允许数据被淘汰的场景,如数据库的实时备份数据存储在Redis中,不允许数据丢失,此时使用此策略,当内存满时,写操作失败,可通过监控和扩展内存等方式解决内存问题。
不同策略对业务影响
volatile - lru
:- 优点:优先淘汰长时间未使用的有过期时间的数据,能较好地维持缓存命中率,对于依赖缓存数据提高响应速度的业务(如网页缓存),可以在一定程度上保证业务性能。
- 缺点:如果有大量长时间未使用但仍需保留的缓存数据,可能会误删,影响业务数据完整性。
allkeys - lru
:- 优点:全面淘汰不常用数据,在没有设置过期时间的数据较多时,能有效释放内存,适用于内存紧张且对数据使用频率有明显区分的业务。
- 缺点:可能淘汰掉正在使用但使用频率相对较低的重要数据,影响业务正常运行。
volatile - ttl
:- 优点:能精准淘汰即将过期的数据,对限时性业务(如限时优惠活动缓存)很友好,可及时释放内存空间,保证业务按预期运行。
- 缺点:若业务中数据过期时间设置不合理,可能导致内存释放不及时或过度释放,影响业务性能。
allkeys - random
:- 优点:简单直接,在内存紧张时能快速释放内存,对于一些临时数据存储业务,数据丢失对整体业务影响不大时较为适用。
- 缺点:可能淘汰掉正在使用的数据,对业务数据稳定性影响较大,不适用于对数据准确性和连续性要求高的业务。
volatile - random
:- 优点:在只淘汰有过期时间数据的前提下,能快速释放内存,对于一些对缓存数据淘汰顺序无严格要求的业务场景适用。
- 缺点:同样存在可能淘汰正在使用数据的风险,对业务连续性有一定影响。
noeviction
:- 优点:保证数据不丢失,对数据完整性要求极高的业务(如金融交易实时记录缓存)非常适用。
- 缺点:当内存满时写操作失败,可能导致业务阻塞,需要额外的处理机制(如监控报警、扩展内存等)来解决内存问题。