面试题答案
一键面试思路
- 过期策略:
- Redis 有三种过期策略:定时删除、惰性删除和定期删除。
- 定时删除:在设置键的过期时间时,同时创建一个定时器,到过期时间时,立即删除键。这种策略对内存最友好,但对 CPU 不友好,因为在高并发环境下,大量的定时删除操作会占用过多 CPU 资源。
- 惰性删除:键值对在被访问时检查是否过期,如果过期则删除。这种策略对 CPU 友好,但对内存不友好,因为可能会导致大量过期键长时间占用内存。
- 定期删除:Redis 定期随机抽取一部分键检查是否过期并删除。通过合理设置定期删除的频率和每次检查的键数量,可以在 CPU 和内存之间找到平衡。在高并发环境下,推荐使用定期删除结合惰性删除的策略。
- 淘汰策略:
- 当 Redis 内存使用达到设置的上限时,需要根据淘汰策略来决定删除哪些键。
- volatile - lru:从已设置过期时间的键中,使用 LRU(最近最少使用)算法删除最近最少使用的键。适用于希望保留长期有效键,只淘汰过期键的场景。
- volatile - ttl:从已设置过期时间的键中,删除剩余 TTL(存活时间)最短的键。适合对过期时间敏感,优先淘汰即将过期键的业务。
- volatile - random:从已设置过期时间的键中,随机删除键。在没有明显使用模式时可采用。
- allkeys - lru:从所有键(无论是否设置过期时间)中,使用 LRU 算法删除最近最少使用的键。适用于不区分键是否过期,都可以淘汰的场景,能有效利用内存。
- allkeys - random:从所有键中随机删除键。
- noeviction:不删除任何键,当内存不足时,执行写操作会报错。这种策略一般不推荐在高并发场景下使用,因为可能导致业务写入失败。
可能用到的 Redis 配置参数
- 过期策略相关:
hz
:该参数控制 Redis 定期删除操作的频率,单位是 Hz(每秒执行次数)。默认值是 10,即每秒执行 10 次定期删除操作。在高并发环境下,可以适当提高这个值,比如设置为 100,但这会增加 CPU 负担,需要根据实际情况权衡。配置方式可以在redis.conf
文件中修改hz
参数值,或者在运行时通过CONFIG SET hz <value>
命令设置。
- 淘汰策略相关:
maxmemory
:设置 Redis 可以使用的最大内存量。当内存使用达到这个值时,淘汰策略开始生效。可以在redis.conf
文件中设置maxmemory <bytes>
,或者在运行时通过CONFIG SET maxmemory <bytes>
命令设置。maxmemory - policy
:设置淘汰策略。可在redis.conf
文件中设置maxmemory - policy <policy>
,如maxmemory - policy allkeys - lru
,也可以在运行时通过CONFIG SET maxmemory - policy <policy>
命令设置,<policy>
取值为上述提到的各种淘汰策略名称。