Redis 内存淘汰
1. 过期删除策略
- Redis 为管理内存,对设置了过期时间的键采用了以下三种删除策略:
1.1 定期删除
- 描述:每隔一定时间扫描
expires字典中的部分键,清除过期键。 - 优点:折中策略,通过调整扫描时间间隔和每次扫描数量,平衡 CPU 和内存资源。
1.2 定时删除
- 描述:为每个设置了过期时间的键创建一个定时器,到达过期时间立即清除。
- 优点:对内存很友好,过期数据能及时清除。
- 缺点:需要消耗大量的 CPU 资源来处理定时器,影响缓存响应时间和吞吐量。
1.3 惰性删除
- 描述:只有在访问某个键时才判断其是否过期,过期则清除。
- 优点:最大化节省 CPU 资源。
- 缺点:可能会有大量过期键未被访问而占用内存。
默认使用惰性过期 (Lazy Expiration)和定期删除 (Periodic Deletion) 两者结合的方式,能够在性能和内存使用之间找到一个良好的平衡。
2. 内存淘汰机制
- Redis 可以通过参数
maxmemory设置内存最大限制,从而避免 Redis 占满机器的内存,影响其他服务。 - 默认值:
maxmemory=0,表示没有限制。- 在 32 位系统 上,Redis 最大支持内存为 3GB(32 位系统最大内存为 4GB)。
- 在 64 位系统 上,Redis 的最大内存限制为物理机的可用内存。
当内存达到 maxmemory 限制时,Redis 会按照 maxmemory-policy 启动相应的淘汰策略,Redis 默认的内存淘汰策略是:noeviction。
2.1 针对设置了过期时间的键
volatile-lru:仅对设置了过期时间的键,淘汰最近最少使用的键。volatile-ttl:仅对设置了过期时间的键,淘汰剩余时间最短的键。volatile-random:仅对设置了过期时间的键,随机淘汰。volatile-lfu:仅对设置了过期时间的键,淘汰访问频率最低的键。
2.2 针对所有键
allkeys-lru:对所有键,淘汰最近最少使用的键。allkeys-random:对所有键,随机淘汰。allkeys-lfu:对所有键,淘汰访问频率最低的键。
2.3 无淘汰策略
noeviction:不进行淘汰,当内存超限时直接返回错误。