Bootstrap

Redis 内存淘汰策略,从根儿上理解

前言

本文参考源码版本 redis6.2

Redis 基于内存设计,所有数据存放在内存,随着时间推移,内存占用也越来也高 ...

由于内存容量这个物理限制,我们需要在内存使用量达到一定比例后,做一些内存清理工作,以保证有足够的空间来完成正常的处理。

在 Redis 中,完成这个工作的就是本文的主角 ------- Redis 内存淘汰机制。

  • 一定比例:在 redis 中就是 maxmemory 阈值
  • 淘汰策略:在 redis 中目前有两种流行的算法:LRU 与 LFU 算法

如果让你来设计一款内存淘汰策略,你会考虑哪些方面?

1)首先,从用户体验上看:

  • 不要影响服务正常使用,实现平滑淘汰
  • 用户透明,用户不需要做任何额外操作

2)其次,从系统层面来看:

  • 何时清理?

  • 清理哪些?

  • 清理多少?

  • 怎样清理?

  • 清理频次?

带着这些问题,我们一起来探索下,Redis 是如何考虑并实现的。

一、淘汰策略

淘汰策略也是可以在 redis.config 中指定:

maxmemory-policy ...
复制代码

截止目前,共有 8 种淘汰策略,如下:

1. 全局淘汰:

1)allkeys-lru:淘汰范围是所有 keys,淘汰最久未使用的 key

2)allkeys-lfu:淘汰范围是所有 keys,淘汰使用频次最少的

3)allkeys-random:淘汰范围:所有 keys,随机淘汰 key

2. 淘汰 expire :

1)volatile-lru:淘汰范围:所有设置了 expire 时间的 keys,淘汰最久未使用的 key

2)volatile-lfu:淘汰范围:所有设置了 expire 时间的 keys,淘汰使用频次最少的 key

3)volatile-random:淘汰范围:所有设置了 expire 时间的 keys,随机淘汰 key

4)volatile-ttl:淘汰范围:所有设置了 expire 时间的 keys,淘汰 ttl 剩余时间最少的 key

3. 不淘汰:

1)noeviction:不淘汰,意味着达到限制时,将无法存储

二、淘汰算法

;