MST
星途 面试题库

面试题:Redis性能调优之内存相关

假设你正在使用Redis处理高并发业务,在内存配置方面,如 `maxmemory` 、 `maxmemory - policy` 等参数如何设置来优化性能并防止内存溢出?当内存达到上限后,不同的 `maxmemory - policy` 策略对业务会产生怎样的影响?请结合具体业务场景说明。
22.9万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

maxmemory 设置

maxmemory 应根据服务器实际可用内存来设置,一般建议预留一部分内存给操作系统及其他进程使用。例如,若服务器总内存为8GB,可设置 maxmemory 为6GB,即给操作系统等预留2GB左右。这样既能充分利用Redis处理高并发业务,又避免因Redis占用过多内存导致系统不稳定。

maxmemory - policy 设置优化性能及防止内存溢出

  1. volatile - lru
    • 适用于业务场景中有较多设置了过期时间的键值对。当内存达到上限时,Redis会从设置了过期时间的键值对中,使用最近最少使用(LRU)算法淘汰部分键值对,以释放内存。例如在缓存业务场景中,缓存数据通常设置了过期时间,使用此策略可以优先淘汰长时间未被访问的缓存数据,保证新数据能正常写入,优化性能并防止内存溢出。
  2. allkeys - lru
    • 适合业务中所有键值对都可被淘汰的场景。该策略会从所有键值对中,通过LRU算法淘汰部分键值对。比如在一个简单的计数器应用中,每个计数器可能没有设置过期时间,但数据量不断增长可能导致内存溢出,使用此策略可根据访问频率淘汰不常用的计数器,优化内存使用。
  3. volatile - ttl
    • 适用于希望优先淘汰即将过期的键值对的场景。在内存达到上限时,Redis会优先淘汰剩余过期时间最短的设置了过期时间的键值对。例如在限时抢购活动的缓存场景中,活动结束后相关缓存数据应尽快释放,使用此策略能优先淘汰快过期的抢购缓存数据,保证内存空间。
  4. allkeys - random
    • 随机从所有键值对中淘汰数据。这种策略不太适合对数据有严格访问要求的场景,但在一些对数据一致性和连续性要求不高,且希望快速释放内存的场景中可能有用,如某些临时数据存储场景,数据丢失对业务影响不大。
  5. volatile - random
    • 随机从设置了过期时间的键值对中淘汰数据。适用于对数据淘汰顺序无特定要求,且只希望淘汰有过期时间键值对的场景,如部分缓存场景中,对缓存数据淘汰无严格规则,只要能释放内存即可。
  6. noeviction
    • 此策略下,当内存达到上限时,Redis不再接受写请求,但读请求仍可正常处理。适用于对数据完整性要求极高,不允许数据被淘汰的场景,如数据库的实时备份数据存储在Redis中,不允许数据丢失,此时使用此策略,当内存满时,写操作失败,可通过监控和扩展内存等方式解决内存问题。

不同策略对业务影响

  1. volatile - lru
    • 优点:优先淘汰长时间未使用的有过期时间的数据,能较好地维持缓存命中率,对于依赖缓存数据提高响应速度的业务(如网页缓存),可以在一定程度上保证业务性能。
    • 缺点:如果有大量长时间未使用但仍需保留的缓存数据,可能会误删,影响业务数据完整性。
  2. allkeys - lru
    • 优点:全面淘汰不常用数据,在没有设置过期时间的数据较多时,能有效释放内存,适用于内存紧张且对数据使用频率有明显区分的业务。
    • 缺点:可能淘汰掉正在使用但使用频率相对较低的重要数据,影响业务正常运行。
  3. volatile - ttl
    • 优点:能精准淘汰即将过期的数据,对限时性业务(如限时优惠活动缓存)很友好,可及时释放内存空间,保证业务按预期运行。
    • 缺点:若业务中数据过期时间设置不合理,可能导致内存释放不及时或过度释放,影响业务性能。
  4. allkeys - random
    • 优点:简单直接,在内存紧张时能快速释放内存,对于一些临时数据存储业务,数据丢失对整体业务影响不大时较为适用。
    • 缺点:可能淘汰掉正在使用的数据,对业务数据稳定性影响较大,不适用于对数据准确性和连续性要求高的业务。
  5. volatile - random
    • 优点:在只淘汰有过期时间数据的前提下,能快速释放内存,对于一些对缓存数据淘汰顺序无严格要求的业务场景适用。
    • 缺点:同样存在可能淘汰正在使用数据的风险,对业务连续性有一定影响。
  6. noeviction
    • 优点:保证数据不丢失,对数据完整性要求极高的业务(如金融交易实时记录缓存)非常适用。
    • 缺点:当内存满时写操作失败,可能导致业务阻塞,需要额外的处理机制(如监控报警、扩展内存等)来解决内存问题。