redis 内存淘汰策略

将 Redis 用作缓存时, 如果内存空间用满, 就会根据配置的最大内存策略返回错误或者自动驱逐老的数据。

maxmemory 配置指令

maxmemory 用于指定 Redis 能使用的最大内存。既可以在 redis.conf 文件中设置, 也可以在运行过程中通过 CONFIG SET 命令动态修改。

例如, 要设置 100MB 的内存限制, 可以在 redis.conf 文件中这样配置

1
maxmemory 100mb

maxmemory 设置为 0, 则表示不进行内存限制。当然, 对32位系统来说有一个隐性的限制条件: 最多 3GB 内存.

内存淘汰策略(maxmemory-policy)
  • noeviction

不删除,达到最大内存,如果继续写(新增)数据,直接返回错误信息。DEL还是可以正常执行。

  • allkeys-lru

所有key范围,优先删除最近最少使用(LRU)

  • volatile-lru

只限于设置了expire的部分,优先删除最近最少使用(LRU)的key

  • allkeys-random

所有key范围,随机删除一部分key

  • volatile-random

只限于设置了expire的部分key,随机删除

  • volatile-ttl

只限于设置了expire的部门;优先删除剩余时间短的key

如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-randomvolatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

内存淘汰的实现

淘汰过程:

  • 客户端执行命令,导致redis中的数据增加,内存增加
  • Redis检查内存使用量,超过maxmemory限制,根据策略清除key

近似LRU算法

为了节约内存,采用了抽取少量的key样本,然后删除其中访问时间最久的key。

在 Redis 的 LRU 算法中, 可以通过设置样本(sample)的数量来调优算法精度。

1
maxmemory-samples <count>